2015-05-08 60 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呢不要兩次使用相同的標題。