改造-2内容类型问题

时间:2016-03-02 12:40:38

标签: android retrofit retrofit2

我的Api正在接受Content-Type application / json作为标题。 我按照Retrofit Docs中的说法完美地设置了Header。

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

但是在Request Log中它返回Content-Type txt / html。所以我应该如何解决这个问题?这个api在POSTMAN中运行良好 enter image description here

enter image description here

7 个答案:

答案 0 :(得分:17)

你可以在我的解决方案中尝试一个:

@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();

答案 1 :(得分:14)

尝试使用Retrofit 1.9和2.0。对于Json内容类型。

{"firstName" :"Arnold", "lastName" : "tpxjzqi"}

你可以添加更多,即

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

答案 2 :(得分:3)

尝试:

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

答案 3 :(得分:1)

Retrofit 2.0令我发疯。 我终于放弃了,并尝试: Android Async Http

它第一次起作用。 我知道您在想我正在寻找stckovflw点 或我正在某种程度上燃烧改造。 我不是。 我的用例是使用简单的内联身份验证来调用我的bitbucket帐户: https://[username]:[password]@api.bitbucket.org/2.0/repositories/[username]

通过翻新,我得到了另一个回应。一个Http 200但不是有效负载 我希望,就像您从邮递员那里得到的一样。 我尽我所能使它工作。 我觉得浪费了2天或更长时间。 我想您可能在想,好吧,您没有正确形成baseUrl或资源的URI。看看上面的内容,它有多么简单……我试图将URI缩短到最小。并将基本网址设置为上述最长的网址;提醒:我收到了Http 200。但是响应负载不正确!

我的一位同事建议使用asynch lib。并给出了所有建议 对于改造和我度过的时间,我表示怀疑。 它是第一次工作!

答案 4 :(得分:0)

也许你需要&#39; /&#39;并且最好不要自己更改内容类型。 就像这样:

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

答案 5 :(得分:0)

这是从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();

答案 6 :(得分:0)

我们也可以为特定请求指定标头。

    @Headers("Content-Type: application/json")
    @Get
    fun getData(@Url url:String):List<Obj>