2015-05-08 36 views
3

我已将我的dropwizard升级到0.8,使用jetty -9服务器。 我使用排气服务器1.0.15从我的应用程序发送我的JSON请求。 我的问题是,当我从volley发送任何JSON时抛出400,而当我发送邮递员的相同请求时,它工作正常。Jetty - 9排除请求错误与排球服务器

WARN [2015-05-07 14:16:18223] org.eclipse.jetty.http.HttpParser:非法字符0x16在状态=开始为缓冲HeapByteBuffer @ 642bbd0f [p = 1时,L = 78, c = 8192,r = 77] = {\ x16 < < < \ x03 \ x00 \ x00I \ x03 \ x01 \ x00 \ x00E \ x03 \ x00 \ xBfE \ x8e \ x82 \ xCb \ xE3 \ xCa ... \ x07 \ xC0 \ X11 \ X00/\ X005 \ X00 \ X05 \ X00 \ xFfV \ X00 \ X01 \ X00 >>> - 1 \ r \ nContent-Lengt ... \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00} WARN [2015-05-08 14:16:18,223] org.eclipse.jetty.http.HttpParser:badMessage:400非法字符0x16 for HttpChannelOverHttp @ 650d154b {r = 0,c = false,a = IDLE,uri = - }

and my code to make volley request

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

非常感谢您的帮助。谢谢。

谁能告诉我如何跟踪完整的请求,而无需创建自定义排球请求,有什么办法吗?

+0

该错误表示您的客户端未发送HTTP请求。如果你可以捕获你的网络流量(最容易在服务器端),你应该有更多的信息来处理。 –

+0

@JoakimErdfelt,但同样的抽签要求以前工作完美,你能告诉我方式截取请求。我无法跟踪,我能看到的是我发送的请求,看起来很完美。 –

+0

使用像Wireshark这样的工具来捕获有问题的流量。错误是告诉你(在原始HTTP请求解析期间),Jetty遇到了一个字节0x16(十六进制)并拒绝了请求(因为该字节在HTTP请求标头中的每个规范中都是无效的) –

回答

1

我追踪了wireshark发送的数据包,发现在头文件中提到了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呢不要两次使用相同的标题。