2016-06-28 26 views
0

我只是嘗試了GAE端點的第一個示例,我修改了示例API方法以類似於此。在GAE端點傳遞陣列

@ApiMethod(name = "sayHi") 
public MyBean sayHi(@Named("name") String[] names) { 

我的期望是接收一串字符串。 現在,當我使用谷歌API瀏覽器來測試這一點,[https://apis-explorer.appspot.com/apis-explorer/] 它生成API這樣

POST https://myprojectid.appspot.com/_ah/api/myApi/v1/sayHi/arg1/arg2/arg3?fields=data 

API explorer screenshot

它最終返回404錯誤。由於端點不被識別。

我在這裏做錯了什麼?實際上瀏覽器顯示爲nameString而不是String[]。任何幫助表示讚賞!

回答

1

不應將數組作爲端點方法的參數,而應該將包含數組的對象(java bean)作爲屬性。

然後你得到你的方法中的對象,你只需讀取屬性並將其視爲一個數組。

經過一些調查研究編輯,您的評論

事實上,以下當您試圖傳遞一個數組作爲Path參數中這是行不通的。數組的不同元素被添加到URL中(如您在問題中所示),並生成404 Not Found錯誤。訣竅是你應該將這個數組作爲Query參數傳遞而不是Path參數。看到這個文檔:https://cloud.google.com/appengine/docs/java/endpoints/parameter-and-return-types#path_parameters

事實上,如果你這樣做,它工作得非常好:

@ApiMethod(name = "sayHi", 
     path = "sayHiWithName") 
public MyBean sayHi(@Named("name") String[] names) { 
    MyBean response = new MyBean(); 
    response.setData("Hi, " + names[0] + names[1]); 

    return response; 
} 

注意,參數不添加到路徑(即我們沒有像路徑sayHiWithName/{名稱})。

+0

聽起來像一個解決方案。但從學術角度來看,傳遞原始數組的正確方法是什麼?由於文檔說,可以傳遞數組/集合。 – Codevalley

+0

@Codevalley:我已經做了一些更多的「研究」並嘗試,並且我在最初的答案中添加了一些迴應元素。 –

1

首先要做的事情是:只有一個String參數時才能工作嗎?有一些servlet映射魔術需要發生以暴露端點,如果這不在項目中,事情就不會起作用。請參閱this link以確保您的web.xml符合要求。

看看這個link,看起來如果你的方法參數是一個基本類型(不是真正的Java對象),並且它沒有明確包含在@Path註釋中,那麼在你的Api:

路徑參數是包含在@ApiMethod註釋路徑屬性中的方法參數。 如果未指定路徑,則任何未使用@Nullable或@DefaultValue註釋的參數將自動添加到路徑(它們將是路徑參數)。

因此,似乎通過在@Path註釋中不包含「名稱」,文檔沒有說明路徑的格式。瀏覽器正在查看的生成描述符似乎認爲正確的答案是/names[0]/names[1]/names[2],有點像C風格的可變參數。這可能是導致404發生的這種脫節。你可以嘗試在@Path註釋中加入「名稱」嗎?

+0

將檢查了這一點。謝謝! – Codevalley