【发布时间】:2015-05-08 12:27:41
【问题描述】:
我已将使用 jetty -9 服务器的 dropwizard 升级到 0.8。 我正在使用 volley server 1.0.15 从我的应用程序发送我的 JSON 请求。 我的问题是,当我从 volley 发送任何 JSON 时,api 会抛出 400,而当我从邮递员发送相同的请求时,它工作正常。
警告 [2015-05-08 14:16:18,223] org.eclipse.jetty.http.HttpParser: 非法字符 0x16 处于状态 = START 缓冲区 HeapByteBuffer@642bbd0f[p=1,l=78,c=8192 ,r=77]={\x16>>-1\r\n内容长度...\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00} 警告 [2015-05-08 14:16:18,223] org.eclipse.jetty.http.HttpParser: badMessage: 400 HttpChannelOverHttp@650d154b{r=0,c=false,a=IDLE,uri=-} 的非法字符 0x16
和我的代码来发出凌空请求
JSONObject userDetails = new JSONObject();
userDetails.put("email", "tasneem");
userDetails.put("password", "1234");
userDetails.put("deviceId", "243243");
userDetails.put("version", "4.4.4");
userDetails.put("platform", "Android");
JsonObjectRequest loginRequest = new JsonObjectRequest(Request.Method.POST, Constants.URL_LOGIN, userDetails, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(TAG, volleyError.toString());
mListener.onError(volleyError);
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
非常感谢您的帮助。谢谢。
谁能告诉我如何在不创建自定义截击请求的情况下跟踪完整请求,有什么办法吗?
【问题讨论】:
-
该错误意味着您的客户端没有发送 HTTP 请求。如果您可以捕获您的网络流量(最容易在服务器端),您应该有更多的信息可以使用。
-
@JoakimErdfelt,但同样的截击请求之前工作得很好,你能告诉我拦截请求的方法吗?我无法追踪,我看到的是我发送的请求,看起来很完美。
-
使用像 Wireshark 这样的工具来捕获有问题的流量。该错误告诉您(在原始 HTTP 请求解析期间)Jetty 遇到了一个字节 0x16(十六进制)并拒绝了请求(因为该字节在 HTTP 请求标头中的任何地方都是无效的,根据规范)
-
另一件要寻找的是方案不匹配。例如尝试将 HTTPS (SSL+HTTP) 与非 HTTPS 连接器(例如普通、普通、没有 SSL 的 HTTP/1.1)通信。
-
这有什么更新吗?我在日志中看到完全相同的错误。你能解决这个问题吗?你做了什么改变使它工作? @JoakimErdfelt 处理方案不匹配的推荐方法是什么?
标签: java android jetty android-volley dropwizard