Android中使用OKHttp3发起POST请求出现500内部服务器错误求助
先给你梳理下代码里可能导致服务器返回500错误的几个关键点,以及对应的修复方案:
1. 请求体MediaType未正确指定
你的RequestBody创建代码存在问题:
final RequestBody body = RequestBody.create(JSON, js.toString());
这里的JSON需要是一个明确的MediaType实例,服务器依赖这个标识来正确解析JSON格式的请求体。另外你已经把js转成json字符串传入方法,直接使用该变量更清晰。修改为:
MediaType JSON = MediaType.parse("application/json; charset=utf-8"); final RequestBody body = RequestBody.create(JSON, json);
如果没有正确指定MediaType,服务器可能无法识别请求体格式,进而抛出内部错误。
2. 第三个条件判断逻辑颠倒
看这段代码:
if (jdb.getJobType(jobNoParam) != null && jdb.getJobType(jobNoParam).equals("")) { instructionsJson.put("Title", jdb.getJobType(jobNoParam)); }
这里的条件是当jobType为空字符串时才设置Title,这和正常业务逻辑完全相反——应该是当jobType有有效值时才赋值。改成:
if (jdb.getJobType(jobNoParam) != null && !jdb.getJobType(jobNoParam).equals("")) { instructionsJson.put("Title", jdb.getJobType(jobNoParam)); }
如果服务器期望instructions里的Title字段在有值时必须存在,空值不符合接口规范,就会导致处理失败。
3. 空对象可能不符合服务器接口要求
你的代码里如果某些条件不满足(比如没有客户信息、没有联系人名称),对应的JSON对象就会变成空对象(比如空的customerJSON、空的contactNameJson)。而服务器的API可能要求这些字段必须包含至少某些必填属性,不能是纯空对象。
比如你提供的测试用JSON里customer有明确的id和name,stops里的Address包含contact和name,但如果代码生成的JSON里customer是空对象{},服务器在解析时可能因为找不到必填的id字段而抛出异常,返回500。
建议你在调用doPostRequest之前打印最终生成的json字符串(比如加Log.d("Final JSON", json);),和测试用的JSON对比,确认结构和必填字段是否一致。
4. AsyncTask的onPostExecute方法签名错误
你的onPostExecute方法签名不符合规范:
protected Void onPostExecute () { return null; }
正确的签名应该是:
@Override protected void onPostExecute(Void result) { // 这里可以处理请求完成后的UI操作,比如隐藏ProgressBar if (progressBar != null) { progressBar.setVisibility(View.GONE); } }
虽然这个不会直接导致500错误,但会导致AsyncTask的回调逻辑无法正常执行,属于代码规范问题。
5. Response.body().string()只能调用一次
在onResponse里你连续调用了response.body().string():
Log.d("TAG --------> onResponse:", response.body().string()); Log.d("JSON TAG ---------->", json); Log.d("TAG Response Message ------>", response.message());
response.body().string()会消耗响应体的流,调用一次后就无法再获取内容。如果后续需要使用响应内容,应该先把它存到变量里:
String responseBody = response.body().string(); Log.d("TAG --------> onResponse:", responseBody); // 后续可以使用responseBody做其他处理
额外建议:检查服务器日志
500错误是服务器内部错误,最好能查看服务器端的日志,看看具体是哪一步抛出了异常(比如JSON解析失败、找不到必填字段、数据库操作错误等),这能更快定位问题。
内容的提问来源于stack exchange,提问作者Mark McCleane




