使用OkHttp请求时持续报错:请求Content-Type需为application/json怎么办?
问题解决:OkHttp设置Content-Type仍报错的处理
你的问题出在重复设置Content-Type头,且手动添加的头带了服务器不认可的后缀:
- 你通过
RequestBody.create(jsonBody, JsonType)已经指定了application/json的MediaType,OkHttp会自动为请求添加正确的Content-Type: application/json头。 - 但你又手动调用
addHeader添加了Content-Type: application/json; charset=utf-8,这会导致请求头中出现重复的Content-Type(或被覆盖成带后缀的版本),而服务器只接受严格的application/json值,因此返回错误。
解决步骤
直接移除手动添加的Content-Type头即可,修改后的代码如下:
int id = 208; MediaType JsonType = MediaType.parse("application/json"); OkHttpClient client = new OkHttpClient(); String jsonBody = "{\"params\":[\"wandelnet\"," + id + "]}"; RequestBody body = RequestBody.create(jsonBody, JsonType); Request request = new Request.Builder() .url( "https://wandelnet.api.routemaker.nl/routemaker/getPublishedRoute") .post(body) .addHeader( "Accept", "application/json") .build(); Response response = client.newCall(request).execute();
如果需要指定字符集,也可以将MediaType改为带charset的版本,同时保持不手动添加头:
MediaType JsonType = MediaType.parse("application/json; charset=utf-8");
这样OkHttp自动生成的Content-Type头会包含字符集,部分服务器也能正常识别。
验证逻辑
Postman中正常运行的请求,其Content-Type头应该是严格的application/json(未添加charset后缀),和修改后OkHttp自动生成的请求头一致,因此能通过服务器校验。
内容的提问来源于stack exchange,提问作者tm1701
相关产品推荐
相关产品推荐

