2014-10-18 155 views
1

我在CookieStore對象中擁有自己的Cookie,但爲了流式傳輸視頻,我需要將我的CookieStore轉換爲字符串,但是我的NodeJS中的API(使用express,cookie-解析器和本地護照)永遠不會識別cookie的價值,無論何時我嘗試對其進行編碼/解碼。我認爲這是一個愚蠢的問題,只是我並不擅長HTTP頭,所以我做錯了。將CookieStore轉換爲字符串:帶編碼/解碼值的pb

有代碼:

Method setVideoURIMethod = videovvw.getClass().getMethod("setVideoURI", Uri.class, Map.class); 
Map<String, String> params = new HashMap<String, String>(1); 
params.put("Cookie", ARequestAPI.getCookieString()); 
setVideoURIMethod.invoke(videovvw, uri[0], params); 

我不得不將代碼從這裏,所以通常它應該很好地工作:Authentication for Videoview in android

我認爲這個問題是來自 「ARequest.getCookieString()」:

protected static CookieStore _cookies = null; 
... 
... 
... 
public static String getCookieString() { 
    String cookieString = ""; 
    Log.v("Debug", _cookies.toString()); 
    for (Cookie cookie : _cookies.getCookies()) { 
     try { 
      Log.v("Debug", "Decode: " + URLDecoder.decode(cookie.getValue(), "UTF-8")); 
      Log.v("Debug", "Encode: " + URLEncoder.encode(cookie.getValue(), "UTF-8")); 
     } catch (UnsupportedEncodingException e1) { 
      e1.printStackTrace(); 
     } 
     cookieString += cookie.getName() + "=" + cookie.getValue()+ ";"; 
    } 
    return cookieString; 
} 

LogCat中的顯示:

LogCat

和日誌上的我的API: 當我使用的CookieStore請求:

{ 'connect.sid': 's:NUTf8t9o8cepR1yYItMexMxy.WFv/ZlktryfpVZHweVozabW1US4UBvGlWxQR7G7Aamc' } 

當我做我的功能,其中的CookieStore轉換爲字符串要求:

{ 'connect.sid': 's:AZXpZmQGX7eJgej9hVA1qaAk.7vWP756Flwbte/qxBRcLOhl/CXMlVO3HVvmsvsEBpzA' } 

我嘗試了所有選項,即使encode(decode()),...但它在我的API上從來就不是一個好選擇。 奇怪的是,我試圖解碼's%3ANUTf...'(所以cookie.getValue())與JavaScript函數「decodeURIComponent()」,我發現正好's:NUTf8t9o8cepR1yYItMexMxy.WFv/ZlktryfpVZHweVozabW1US4UBvGlWxQR7G7Aamc',所以我的cookie是好的,但我認爲我在編碼/解碼部分做錯了什麼。

感謝您的幫助。編輯:經過多次測試,我發現在API上,Cookie的值始終相同,無論何時使用URLDecoder.decode(),URLDecoder.decode()或事件直接cookie.getValue(),只有當我獲得正確的價值時,我自己「選擇/寫入」自己的價值,如「totoauzoo」,例如與這種威脅,我得到完全相同的API值。但它不適用於我的舊cookie值,如「s:DMCBao7zeS9B2jwIfeQoDZtl.3XPIYIm7y2Bz9/o468v4wxvFZmjDrc6hKk4ty89sIX4」。

EDIT2:我可能會發現什麼是錯的,我得到的API:

與請求HTTPGET和的CookieStore:

headers { host: 'xxx', 
    connection: 'Keep-Alive', 
    'user-agent': 'Apache-HttpClient/UNAVAILABLE (java 1.4)', 
    cookie: 'connect.sid=s%3AGRGciNxOcR4BXHrUG8PikHMX.MyWa6vjW%2BBlcUaaCHHendqc7DEK4aoNFDzm5aabOkDM', 
    cookie2: '$Version=1' } 
cookies { 'connect.sid': 's:GRGciNxOcR4BXHrUG8PikHMX.MyWa6vjW+BlcUaaCHHendqc7DEK4aoNFDzm5aabOkDM' } 

要求與setVideoURI:

頭{主持人:「 XXX ' 連接: '保持活動', 餅乾: 'connect.sid = S%3AKWKdcuXqUpzBIMv0sOGpPxqM.xb14kPsGKvn%2FV%2BVcfUDzxWsye8QdJfuQgonNocsX3k8', '用戶代理':' 怯場/ 1.2(Linux的;的Android 4.1.2) 「 , '接受編碼': 'gzip的,放氣'} 餅乾{ 'connect.sid': 'S:KWKdcuXqUpzBIMv0sOGpPxqM.xb14kPsGKvn/V + VcfUDzxWsye8QdJfuQgonNocsX3k8'}

我該如何解決呢?

回答

1

我會建議檢查網絡流量本身。 Cookies是沒有別的比HTTP頭...

HTTP/1.0 200 OK 
Content-type: text/html 
Set-Cookie: name=value 
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT 

GET /spec.html HTTP/1.1 
Host: www.example.org 
Cookie: name=value; name2=value2 
Accept: */* 

我不熟悉您正在使用設置餅乾類,但我會檢查兩個地方:

1:

params.put("Cookie", ARequestAPI.getCookieString()); 

這個調用是設置標題還是設置POST參數?這應該在網絡流量中可見。什麼是params?標題,查詢字符串?

2:

ARequestAPI.getCookieString() 

是在正確的cookie值格式此函數的輸出,或者是什麼呢?

很可能在其中一個地方存在錯誤。

+0

如何檢查網絡流量?所以爲1)我設置:http://developer.android.com/reference/android/widget/VideoView.html#setVideoURI%28android.net.Uri,%20java.util.Map%3Cjava.lang.String ,%20java.lang.String%3E%29和2)我更確定它是正確的格式,因爲我自己做了這個函數,但是cookie的名字在API上很好,只是值不對。 – Marchah 2014-10-22 09:38:43

+0

檢查我的編輯謝謝 – Marchah 2014-10-22 10:52:24

+1

使用例如查爾斯http://www.charlesproxy.com/調試您的流量 – Drejc 2014-10-22 12:45:27

相關問題