【问题标题】:Jetty - 9 BAD REQUEST ERROR with Volley serverJetty - Volley 服务器出现 9 BAD REQUEST ERROR
【发布时间】: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


【解决方案1】:

我跟踪了wireshark中发送的数据包,发现在header中,Content-Type被提到了两次。

Content-Type: application/json; charset=utf-8\r\n
Content-Type: application/json; charset=utf-8\r\n
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; HTC Desire 526GPLUS dual sim Build/KOT49H)\r\n
.
. 
.

删除覆盖的方法 getHeaders() 有效 罢工>

@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;
}

不需要覆盖,因为在 com.android.volley.toolbox.JsonRequest.java 中,Content-Type 已经设置为 application/json; charset=utf-8,而且 dropwizard 0.8 似乎不会两次采用相同的标头。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2020-10-01
    • 2020-11-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2014-12-04
    • 2010-12-13
    相关资源
    最近更新 更多