web-dev-qa-db-ja.com

レトロフィットにヘッダーパラメーターを追加

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 $
23
jamian

数回試した後、私は答えを見つけました。

エラー

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);
4
jamian

以下を使用できます

 @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");
33
Raghunandan

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を使用している場合は{ }を削除してください。そうでない場合は動作しません

25
Avinash Verma

enter image description here

応答をご覧ください。入力したAPIキーが間違っていることを明確に示しています。最初に正しいAPIキーを取得します。次に、それが機能するリクエストを呼び出します。

0

私が見る限り、あなたは間違った方法でデータを渡している。メソッドgetRestaurantsBySearchは、ヘッダーフィールドとして最後の2つのパラメーター、つまりacceptuser-keyを受け入れています。しかし、メソッドを呼び出す間、最初にヘッダーを渡します。 getRestaurantsBySearchのメソッドシグネチャで宣言したとおりにデータを渡します

0
Nitin Joshi