web-dev-qa-db-ja.com

Retrofit-2コンテンツタイプの問題

My ApiはContent-Type application/jsonをヘッダーとして受け入れています。 Retrofit Docsで述べたように、ヘッダーを完全に設定しました。

@Headers("Content-Type: application/json")
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

しかし、リクエストログではContent-Type txt/htmlを返しています。このAPIはPOSTMANで正常に動作します enter image description here

enter image description here

あなたは私の解決策の下で1つを試すことができます:

@POST("user/classes")
Call<playlist> addToPlaylist(@Header("Content-Type") String content_type, @Body PlaylistParm parm);

それから電話する

mAPI.addToPlayList("application/json", playListParam);

または

HttpClientオブジェクトを作成する

OkHttpClient httpClient = new OkHttpClient();
        httpClient.networkInterceptors().add(new Interceptor() {
            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

次に、レトロフィットオブジェクトに追加します

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
19
Phan Dinh Thai

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"
    })
16
Avinash Verma

試してください:

@POST("user/classes")
Call<playlist> addToPlaylist(
@Header("Content-Type") String contentType,
@Body PlaylistParm parm);
3
Anurag Chutani

Retrofit 2.0は私を夢中にさせました。私は最終的にあきらめて試してみました: Android Async Http

そして、それは初めて働きました。私はstckovflwポイントを探しているか、何らかの形でレトロフィットを燃やしているとあなたが考えていることを知っています。私は違います。私のユースケースは、単純なインライン認証でbitbucketアカウントを呼び出すことでした: https:// [username]:[password] @ api.bitbucket.org/2.0/repositories/[username]

Retrofitを使用すると、別の応答が得られました。 Http 200ですが、Postmanから取得するようなペイロードは期待していません。私はそれを機能させるために見つけることができるすべてを試しました。無駄に2日以上かかると思います。おそらく、baseUrlを正しく構成していなかったか、またはリソースのURIを考えていなかったと思います。上記を見て、どれほど簡単にできるか...私はURIを最小に短縮しようとしました。ベースURLを上記の最も長い部分に設定します。注意:Http 200が返ってきました。しかし、正しい応答ペイロードではありません!

私の同僚は、非同期ライブラリの使用を提案しました。レトロフィットに関するすべての推奨事項と私が費やした時間を考えると、私は懐疑的でした。初めて働いた!!

2
Beezer

以下に、retrofit2(v2.5)およびokhttp3で機能するソリューションを示します。これらのヘッダーを多くのリクエストに追加する場合、特にうまく機能します

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
        httpClientBuilder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                requestBuilder.header("Accept", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

 OkHttpClient httpClient = httpClientBuilder.build();
 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient)
                .build();
1
Mitch M

「/」が必要な場合があります。Content-Typeを自分で変更しないことをお勧めします。ちょうどこのような:

@POST("user/classes/")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
0
Yongjian H