APIキーを渡す必要があるAPIを呼び出そうとしています。
HtppURLconnectionを使用したSercive呼び出しは完全に機能しています。
url = new URL("https://developers.zomato.com/api/v2.1/search?entity_id=3&entity_type=city&q=" + params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("user-key","9900a9720d31dfd5fdb4352700c");
if (urlConnection.getResponseCode() != 200) {
Toast.makeText(con, "url connection response not 200 | " + urlConnection.getResponseCode(), Toast.LENGTH_SHORT).show();
Log.d("jamian", "url connection response not 200 | " + urlConnection.getResponseCode());
throw new RuntimeException("Failed : HTTP error code : " + urlConnection.getResponseCode());
}
ただし、RetroFitでどのように機能するかはよくわかりませんが、いつでも失敗に陥ります。同じサービスコールに使用するコードは次のとおりです。
@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query,@Header("Accept") String accept, @Header("user-key") String userkey);
そして私はこれを使ってそれを呼び出しています
Call<String> call = endpoint.getRestaurantsBySearch("3","city","mumbai","application/json","9900a9720d31dfd5fdb4352700c");
これらの呼び出しはすべて、RetroFitのOnFailureメソッドに入ります。 HeaderParametersなしで送信すると、403の理由で成功します。明らかに、APIキーをどこかに渡す必要がありますが、方法がわかりません。
@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
OnFailureで私が得ているエラーは
Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
数回試した後、私は答えを見つけました。
エラー
Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
jSONの解析に失敗したために来ていました。
メソッド呼び出しでは、POJOクラスの代わりにStringを渡していました。
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
Call <String>の代わりにCall <Data>のタイプを渡す必要がありました
データがPojoクラスである
このようなもの
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<Data> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
以下を使用できます
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
そして
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes");
上記はzomato apiに基づいています。
https://developers.zomato.com/documentation#!/restaurant/search
注意するのは、エンドポイントの変更api/v2.1/searchとヘッダー@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
です。
また、ベースURLを確認してください.baseUrl("https://developers.zomato.com/")
また、私は生成されたAPIキーで上記を試してみましたが、それは動作し、私のクエリはzomatoドキュメントが示唆するようにcafesでした.
注:私はあなたが以下を持っていることを望みます
.addConverterFactory(ScalarsConverterFactory.create()) // for string conversion
.build();
build.gradleファイル内の以下
compile group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.2.0'
編集:
以下のように動的な値を持つヘッダーを渡すこともできます
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query,@Header("user-key") String userkey);
そして
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes","9900a9720d31dfd5fdb4352700c");
Retrofit 1.9および2.0のこのタイプヘッダーを試してください。 Jsonコンテンツタイプ用。
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
さらに多くのヘッダーを追加できます
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
UPDATE Kotlinを使用している場合は{ }
を削除してください。そうでない場合は動作しません
私が見る限り、あなたは間違った方法でデータを渡している。メソッドgetRestaurantsBySearch
は、ヘッダーフィールドとして最後の2つのパラメーター、つまりaccept
とuser-key
を受け入れています。しかし、メソッドを呼び出す間、最初にヘッダーを渡します。 getRestaurantsBySearch
のメソッドシグネチャで宣言したとおりにデータを渡します