2016-12-14 9 views
1

Android RetrofitライブラリのURLに2種類の値を渡してみましたが、方法1はエラーなしで実行されますが、方法2ではエラーが発生します。AndroidでのURLへの値渡しの違いRetrofitライブラリ

私は方法2によってスローされるエラー

方法2にAPIエンドポイントのクエリ方法1での注釈付きパラメータの値を持つキー名と変数置換によってパラメータ値を送っ:

java.lang.IllegalArgumentException: URL query string "appid={apikey}&lat={lat}&lon={lon}&units={units}" must not have replace block. For dynamic query parameters use @Query. 

マイURL:データ/ 2.5 /天候LAT = 77.603287 & LON = 12.97623 & APPID = f5138 &単位=メトリック

方法1:(ウェル実行される)

@GET("data/2.5/weather") 
Call<Weather> getWeatherReport(@Query("lat") String lat, 
           @Query("lon") String lng, 
           @Query("appid") String appid, 
           @Query("units") String units); 

方法2:私は、第二の方法において、ならびに(エラー)

@GET("data/2.5/weather?appid={apikey}&lat={lat}&lon={lon}&units={units}") 
Call<Weather> getWeatherReport1(@Query("apikey") String apikey, 
           @Query("lat") String lat, 
           @Query("lon") String lng, 
           @Query("units") String units); 

@Path試みました。

私の質問は です1.両方の方法の違いは何ですか? 2. 2番目の方法がうまくいかなかったのはなぜですか?

+0

を理論的にパスに置き換える必要があります。最初のものは、あなたのためのクエリ文字列を作成し、2番目のものは手動で作成します。 –

答えて

4

第2の方法は動作しません。理由:

URLクエリ文字列には置き換えないブロック。動的クエリの場合は パラメータは@クエリを使用します

したがって、@Pathアノテーションを使用すると動作しません。最初のメソッドのように、@Queryアノテーションを使用してクエリパラメータを動的に割り当てることができます。

@GET("data/{version}/") 
Call<Weather> getWeatherReport1(@Path("version") String version); 
+0

正確には、正解、私はそれを探しています – Suman

0

最初に、クエリ文字列(HTTP url params)でパラメータを送信し、パスパラメータ(REST)として送信します。詳細については

はここを見て取る:https://en.wikipedia.org/wiki/Query_stringだから、

Rest Standard: Path parameters or Request parameters

をエンドポイントがパスのparamsをサポートしている場合、第2の方法は、次のようになります。

@GET("data/2.5/weather?appid={apikey}&lat={lat}&lon={lon}&units={units}") 
Call<Weather> getWeatherReport1(@Path("apikey") String apikey, 
           @Path("lat") String lat, 
           @Path("lon") String lng, 
           @Path("units") String units); 
0

のように、パスパラメータのみを動的に適用できます。エラーが示唆するように、動的クエリパラメータをURLクエリ文字列に配置しないでください。

ブロックを交換する、つまり{}はパスパラメータとともに使用する必要があります。 無効なクエリとパスのパラメータが混在しているため、エラーが発生します。

ASエンドポイントがパスパラメータをサポートしている場合は、

関連する問題