android Retrofit-2内容类型问题

tvokkenx  于 2022-12-09  发布在  Android
关注(0)|答案(8)|浏览(114)

我的API正在接受内容类型的应用程序/json作为头文件。我按照Retrofit文档中提到的那样完美地设置了头文件。

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

但是在请求日志中,它返回的是内容类型txt/html。那么我应该如何解决这个问题呢?这个API在POSTMAN x1c 0d1x中运行良好

xqk2d5yq

xqk2d5yq1#

对于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"
    })

动态添加到标头:

@POST("user/classes")
Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);

调用你的方法,即

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

或者
要通过Everytime则用http Interceptor创建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();

UPDATE如果您正在使用Kotlin,请删除{ },否则它将无法工作

t0ybt7op

t0ybt7op2#

你可以试试下面我的解决方案之一:

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

pexxcrt23#

下面是一个自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();
kr98yfug

kr98yfug4#

试试看:

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

ttcibm8c5#

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但不是正确的响应负载!
我的一个同事建议使用asynch lib。考虑到所有的改造建议和我花的时间,我持怀疑态度。它第一次就起作用了!!

cnjp1d6j

cnjp1d6j6#

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

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

xytpbqjk7#

可能您需要'/',最好不要自行更改内容类型。就像这样:

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

relj7zay8#

使用@标头(“内容类型:应用程序/json-patch+json”)@PATCH(“用户/编辑”)
帮我解决了这个问题。

相关问题