我的API正在接受内容类型的应用程序/json作为头文件。我按照Retrofit文档中提到的那样完美地设置了头文件。
@Headers("Content-Type: application/json") @POST("user/classes") Call<playlist> addToPlaylist(@Body PlaylistParm parm);
但是在请求日志中,它返回的是内容类型txt/html。那么我应该如何解决这个问题呢?这个API在POSTMAN x1c 0d1x中运行良好
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,请删除{ },否则它将无法工作
{ }
t0ybt7op2#
你可以试试下面我的解决方案之一:
@POST("user/classes") Call<playlist> addToPlaylist(@Header("Content-Type") String content_type, @Body PlaylistParm parm);
则呼叫了
或者
创建HttpClient对象
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();
kr98yfug4#
试试看:
@POST("user/classes") Call<playlist> addToPlaylist( @Header("Content-Type") String contentType, @Body PlaylistParm parm);
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。考虑到所有的改造建议和我花的时间,我持怀疑态度。它第一次就起作用了!!
cnjp1d6j6#
我们也可以为特定请求指定头。
@Headers("Content-Type: application/json") @Get fun getData(@Url url:String):List<Obj>
xytpbqjk7#
可能您需要'/',最好不要自行更改内容类型。就像这样:
@POST("user/classes/") Call<playlist> addToPlaylist(@Body PlaylistParm parm);
relj7zay8#
使用@标头(“内容类型:应用程序/json-patch+json”)@PATCH(“用户/编辑”)帮我解决了这个问题。
8条答案
按热度按时间xqk2d5yq1#
对于Retrofit 1.9和2.0,请尝试使用此类型标头。对于Json内容类型,请尝试使用此类型标头。
您可以添加更多的标题,例如
动态添加到标头:
调用你的方法,即
或者
要通过Everytime则用http Interceptor创建HttpClient对象:
然后添加到改造对象
UPDATE如果您正在使用Kotlin,请删除
{ }
,否则它将无法工作t0ybt7op2#
你可以试试下面我的解决方案之一:
则呼叫了
或者
创建HttpClient对象
然后添加到改造对象
pexxcrt23#
下面是一个自retrofit2(v2.5)和okhttp3起就可以使用的解决方案。
kr98yfug4#
试试看:
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。考虑到所有的改造建议和我花的时间,我持怀疑态度。它第一次就起作用了!!
cnjp1d6j6#
我们也可以为特定请求指定头。
xytpbqjk7#
可能您需要'/',最好不要自行更改内容类型。就像这样:
relj7zay8#
使用@标头(“内容类型:应用程序/json-patch+json”)@PATCH(“用户/编辑”)
帮我解决了这个问题。