OkHttp POST请求返回null问题排查求助
排查OkHttp POST请求返回null的问题
我来帮你梳理下代码里的关键问题,这些点很可能导致你的rs变量一直为null:
1. 空catch块吞噬了异常
你的main方法里的catch (IOException EX)块是空的!这就意味着如果post方法抛出了IO异常(比如网络连接失败、服务器返回错误状态码),你完全看不到任何错误信息,rs会保持初始的null值。
赶紧修改catch块,添加异常打印:
catch (IOException ex){ ex.printStackTrace(); // 打印异常栈,直接看到问题根源 }
这一步是最快定位问题的关键——你会发现可能根本不是返回null,而是请求过程中抛出了异常。
2. 响应处理的不严谨
你当前的post方法没有检查响应是否成功,比如服务器返回400、500这类错误码时,response.body().string()可能返回null或者空内容,同时也不会抛出异常。
推荐用try-with-resources优化响应处理,同时添加状态码校验:
public String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(json, JSON); Request request = new Request.Builder() .url(url) .post(body) .build(); // try-with-resources会自动关闭Response,避免资源泄漏 try (Response response = client.newCall(request).execute()) { // 先校验响应是否成功(状态码200-299) if (!response.isSuccessful()) { throw new IOException("请求失败,状态码: " + response.code()); } return response.body().string(); } }
这样如果服务器返回错误码,会直接抛出异常,你能在catch块里捕获并看到具体问题。
3. Android环境的额外检查
从你用StrictMode来看,这应该是Android项目,别忘了在AndroidManifest.xml里添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
如果没有这个权限,网络请求会直接失败,而你的空catch块会把这个异常吃掉,导致rs为null。
4. 手动拼接JSON的潜在风险
虽然你说Postman测试正常,但手动拼接JSON的方式很容易出错(比如数字格式、引号遗漏)。推荐用Gson/Jackson这类库生成JSON,避免手动拼接的低级错误:
// 先定义实体类 class LocationRequest { public Integer id = null; public String datetime = "2019-01-10T19:00:00.000+0000"; public User user; public Double latitude; public Double longitude; public LocationRequest(Double lg, Double lt) { this.user = new User(1); this.longitude = lg; this.latitude = lt; } static class User { public Integer id; public User(Integer id) { this.id = id; } } } // 生成JSON String bowlingJson(Double lg,Double lt) { Gson gson = new Gson(); return gson.toJson(new LocationRequest(lg, lt)); }
总结
先给catch块加上异常打印,这能让你直接看到问题所在。之后再按照上面的优化点调整代码,应该就能解决rs返回null的问题了。
内容的提问来源于stack exchange,提问作者Anass Tahiri
相关产品推荐
相关产品推荐

