2016-06-28 8 views
0

GAEエンドポイントの最初の例を試しています。これに似たサンプルAPIメソッドを変更しました。GAEエンドポイントでの配列の受け渡し

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

私は、文字列の配列を受け取ることを期待しています。 今、私はこれをテストするには、Google API Explorerを使用する場合、[https://apis-explorer.appspot.com/apis-explorer/] それが最終的に404エラーを返します。この

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

API explorer screenshot

のようなAPIを生成します。エンドポイントが認識されないためです。

私はここで間違っていますか?実際にエクスプローラは、nameStringではなく、String[]と表示しています。どんな助けもありがとう!

答えて

1

配列をエンドポイントメソッドのパラメータとして使用する代わりに、配列をプロパティとして含むオブジェクト(Java Bean)を配置する必要があります。

あなたはメソッド内のオブジェクトを取得し、プロパティを読み込んで配列として扱います。いくつかのより多くの研究の後

編集、あなたはそれが動作しないPathパラメータとして配列を渡すしようとすると、確かにあなたのコメント

を以下に示します。配列のさまざまな要素がURLに追加され(質問に表示されるように)、404 Not Foundエラーが生成されます。これは、この配列をPathパラメータではなくQueryパラメータとして渡す必要があるということです。このドキュメントを参照してください: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

最初のものが最初にあります:単一の文字列パラメータがある場合、これは機能しますか?エンドポイントを公開するために起こる必要のあるサーブレットマッピングの魔法がありますが、それがプロジェクトに存在しない場合は動作しません。 web.xmlが正しいかどうか確認するには、this linkを参照してください。

このlinkを見ると、メソッドパラメータが基本型(実際のJavaオブジェクトではない)で、@Pathアノテーションに特別に含まれていない場合は、あなたの中で何が起こるかにある程度の不確実性があるようですApi:

パスパラメータは、@ApiMethodアノテーションのpathプロパティに含まれるメソッドパラメータです。 pathが指定されていない場合、@ Nullableまたは@DefaultValueで注釈が付けられていないパラメータは自動的にパス(パスパラメータになります)に追加されます。

@Pathアノテーションに「名前」を含めないことで、ドキュメントのパスの形式がわからないようです。エクスプローラが見ている生成された記述子は、正しい答えが/names[0]/names[1]/names[2]で、Cスタイルのvarargsのようなものだと思えるようです。この切断によって、404が発生する可能性があります。@Path注釈に「名前」を含めると試してみませんか?

+0

これをチェックします。ありがとう! – Codevalley