2011-06-05 11 views
1

以前我在Android to Drupal cookie transfer問了一個關於從我的Android應用程序發回cookies到我的Drupal網站的問題,我得到了一個很好的答案。整個想法是啓用持續的客戶端 - 服務器交互。Android to Drupal cookie轉移Q2

我按照指示調整了代碼,但仍然無法正常工作。我的代碼調整低於:

protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 

     HttpResponse response; 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost  = new HttpPost("http://testsite.com/testpoint/node/"); 

     BasicHttpContext basicContext = new BasicHttpContext(); 
     org.apache.http.client.CookieStore cookiestore = new BasicCookieStore(); 
     basicContext.setAttribute(ClientContext.COOKIE_STORE, cookiestore); 
     basicContext.setAttribute(USERPREFERENCES.getString(COOKIE_NAME, ""), USERPREFERENCES.getString(COOKIE_VALUE, "")); 
     //USERPREFERENCES.getString(CO0OKIE_NAME, ""), USERPREFERENCES.getString(COOKIE_VALUE, "") 

      // TODO Auto-generated method stub 
      try{ 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("node[title]", "sample node from app")); 
       nameValuePairs.add(new BasicNameValuePair("node[type]", "story")); 
       nameValuePairs.add(new BasicNameValuePair("node[body]", "sample app node body content")); 
       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       //Execute HTTP post request 
       //HttpResponse 
       response = httpClient.execute(httpPost, basicContext); 

       Log.i("SEEMS TO WORK", response.toString()); 
       Log.v("CODE", httpPost.getRequestLine().toString() + " - " + response.toString()); 

      }catch(Exception e){ 
       Log.e("HTTP-ERROR: node creation", e.toString()); 
      } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     //Toast.makeText(getApplicationContext(), "Create Node thread returning!", Toast.LENGTH_LONG).show(); 
     Toast.makeText(getApplicationContext(), "Testing header: Cookie: " + USERPREFERENCES.getString(COOKIE_NAME, "") +","+ USERPREFERENCES.getString(COOKIE_VALUE, ""), Toast.LENGTH_LONG).show(); 
    } 

} 

基本上,我的cookie的名稱和值都存儲在我的共享偏好USERPREFERENCES.getString(COOKIE_NAME, 「」)和USERPREFERENCES.getString(COOKIE_VALUE, 「」)。 我正在嘗試發回這些信息,以便當此函數執行併成功在我的Drupal站點上創建新的故事節點時,作者將被識別爲從Android應用程序註冊並登錄的用戶。

目前,該節點已創建,但用戶是「匿名」的。因此,我需要發回Drupal的用戶cookie信息。

任何人都可以請幫助我嗎?

回答

1

這不一定是解決您的問題的代碼,但可能會有幫助。

當我接近這樣的問題時,我需要一種方法來查看來自我的應用程序的請求標題的外觀。

我通常使用查爾斯(偉大的工具)http://www.charlesproxy.com/爲此。沒有我與公司沒有任何關係,它只是一個偉大的工具。

Charles有一個叫做反向代理的功能,基本上它允許你通過Charles將流量反彈到你的drupal服務器,並且可以在流入和流出你的應用時檢查它。

使用charles,您可以嗅探來自您的Web瀏覽器的良好請求的樣子,然後您可以嗅探您的Android應用程序的請求是什麼樣的。比較兩者,你可以看到你的應用程序嚴重地改變了請求標題的位置。

調試階段是這樣的:

一旦你得到了查爾斯成立,打你的Drupal服務器幾次,檢查請求/響應,你從瀏覽器中看到的結構。

然後從android應用程序打了幾次你的服務,並注意差異。也許cookie沒有通過,也許它是畸形的,也許還有關於標題的其他內容。這將讓你看到你需要拍攝什麼,以便讓Drupal接受請求。

一些說明 -

反向代理將允許你檢查流量從您的手機來來往往您的Drupal站點(包括報頭,所以你應該可以看到正在發送什麼餅乾)。爲了設置反向代理,您需要在代理菜單下去反向代理並添加一個新的反向代理 - 代理會將流量指向您的localhost:PORTNUM並將其重新路由到您的drupal服務器。它將記錄雙向通信。此外,您可以從FireFox中多次訪問您的drupal服務,並觀察Web應用程序如何進行身份驗證,以便了解您的目標。

爲了查看手機流量,您需要確保手機連接到與您的計算機相同的網絡。重新編寫您的電話代碼,以便將其Web請求發送到本地計算機。如果你已經正確配置了一切,那麼Charles會彈出一條消息,詢問你是否允許你的手機連接。之後,您可以看到您從Web服務器發送的標頭有什麼不同。

+0

謝謝你的工具建議。我馬上開始。 – sisko 2011-06-05 21:17:16

+0

np。正確設置反向代理可能會有一些竅門。如果您遇到麻煩,請告訴我,我可以嘗試將您指向正確的方向。 – walta 2011-06-05 23:16:23

+0

嗨沃爾塔,這聽起來很瘋狂,但charlesproxy網站似乎倒閉了。我設法在家裏在Linux上下載它,但在我的Windows機器上工作,我可以花更多的時間玩它,該網站拒絕加載... – sisko 2011-06-07 08:17:43