我为POST创建了一个简单的截击请求
//post request handler
public void PostRequest(final int queryType, String url, final String jsonData) {
StringRequest req = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
for (ApiRequestHandler commHandler : responseListeners) {
commHandler.responseHandler(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
for (ApiRequestHandler commHandler : errorListeners) {
commHandler.errorHandler(error);
}
}
}) {
@Override
public byte[] getBody() {
return jsonData.getBytes();
}
@Override
public String getBodyContentType() {
return "application/json";
}
@Override
public Map<String, String> getHeaders() {
HashMap<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
getVolleyQueue().add(req);
}
当我在调试模式下发送请求时(此Android设备已连接至Android Studio),此方法有效,而当我释放该应用程序并收到400错误时,此方法不起作用。 我添加了Internet权限。
发布应用程序时很难调试,我只是在收到错误时尝试举杯。 stacktrace就是这样,但是对我没有帮助。
com.android.volley.toolbox.BasicNetwork.a(Unknown Source:255),
com.android.volley.NetworkDispatcher.b(Unknown Source:37),
com.android.volley.NetworkDispatcher.run(Unknown Source:5)
我花了整整一天的时间来解决这个问题,我的一些建议却很少:
从服务器端的版本发送请求时,我可以看到正文为空,但是以APK级别打印数据
我也尝试了jsonData.getBytes("utf-8");
,但没有成功
我正在使用implementation 'com.android.volley:volley:1.1.1'
我还需要一些有关调试已发布的APK的更好方法的准则。谢谢!
答案 0 :(得分:0)
更多的挖掘之后,我可以找到根本原因:
问题是因为我为版本号为minifyEnabled true
的发行版本启用了ProGuard。它通过更改类名,变量,常量等各种方式压缩和混淆代码。
Gson,使用动态键命名使键变短。
为解决此问题,我使用了@SerializedName("keyName")
批注,让Gson知道应该考虑什么作为密钥。
例如:
public class UserInfo {
@SerializedName("user_name")
public String userName;
@SerializedName("mobile")
public String mobile;
}
希望这可以节省某人的一天!