使用OkHttp发送JSON请求时服务端不识别类型返回404问题求助
问题根因
- 核心错误是构造好的JSON请求体未被实际使用,反而传入了空的表单格式请求体,服务端无法匹配对应接口的参数格式要求,因此返回404状态码。
- 原代码中
RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));这行的返回值没有赋值给变量直接被丢弃,后续请求使用的是空的FormBody,和预期发送JSON的逻辑完全不符。
修正后的代码
private final OkHttpClient client = new OkHttpClient(); JSONObject jsonObj = new JSONObject(); try { jsonObj.put("imei",number); jsonObj.put("longitude", number); jsonObj.put("latitude", number); jsonObj.put("speed", number); jsonObj.put("battery", number); jsonObj.put("date", date); jsonObj.put("error", number); jsonObj.put("acceleroVal", number); jsonObj.put("apn", string); } catch (JSONException e) { e.printStackTrace(); } String json = jsonObj.toString(); // 保留JSON请求体并赋值给变量 // 若使用OkHttp 4.x版本,参数顺序需调整为RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json) RequestBody jsonBody = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8")); Request request = new Request.Builder() .url("http://xxxx.com:2000/api/xxx") // 传入JSON请求体,删除原有无用的空FormBody .put(jsonBody) // 如果服务端要求POST请求,把上面的put替换为post即可:.post(jsonBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { e.printStackTrace(); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { if(response.isSuccessful()) { ResponseBody responseBody = response.body(); // 此处可处理服务端返回的响应内容 } } });
额外排查建议
- 确认服务端接口接受的请求方法是PUT还是POST,若接口声明为POST,把
.put(jsonBody)替换为.post(jsonBody)即可。 - 若修改后仍返回404,检查请求URL的域名、端口、路径是否完全和服务端提供的接口地址一致,注意大小写、路径后缀是否匹配。
内容的提问来源于stack exchange,提问作者DroidBarber
相关产品推荐
相关产品推荐

