2015-09-30 54 views
0

有人可能會問我的問題,但我找不到任何建議。Android調用帶POST數據的Django服務器

我寫一個Android應用程序這就需要通過使用HttpsURLConnection然後Django服務器會返回一個JSON陣列到Android來訪問我的Django服務器。

Django中的查看功能將接收來自request.POST的參數並生成JSON數組,然後使用HTTPResponse返回Django方法。它不需要任何模板和表單。

當我從Android調用Django視圖函數時,它返回403錯誤。我知道這是因爲POST數據不包含「csrf_token」。

我的問題是:如何在發送到Django之前,將「csrf_token」放入我的POST數據中?我嘗試通過「@csrf_exempt」禁用CSRF檢查,它可以將正確的結果返回給Android應用程序,但我不會禁用CSRF檢查。

感謝, 威爾遜

+0

看看這篇文章http://stackoverflow.com/a/17283820/2967875 – zzas11

回答

0

你要發送的cookie,也有送報頭「X-CSRFToken」與csrftoken。

這是我做的(可能不是最好的方法):

  1. 獲得通過獲取請求予以幫助CSRF令牌第一次嘗試,看看你做的相同的請求得到了csrftoken您的cookie瀏覽器和開發者工具。如果沒有,你應該使用ensure_csrf_cookie裝飾

    from django.views.decorators.csrf import ensure_csrf_cookie 
    @ensure_csrf_cookie 
    def your_view(request): 
        pass 
    
  2. 現在使用相同的HttpURLConnection的對象做這樣的:

    String cookieString=""; 
    String csrftoken=""; 
    
    // The below code can be shortened using for-each loop 
    List<HttpCookie> cookies=cookieManager.getCookieStore().getCookies(); 
    Iterator<HttpCookie> cookieIterator=cookies.iterator(); 
    while(cookieIterator.hasNext()){ 
        HttpCookie cookie=cookieIterator.next(); 
        cookieString+=cookie.getName()+"="+cookie.getValue()+";"; 
        if(cookie.getName().equals("csrftoken")){ 
         csrftoken=cookie.getValue(); 
        } 
    } 
    
  3. 以下內容添加到您的POST請求:

    urlConnection.setRequestProperty("X-CSRFToken", csrftoken); 
    urlConnection.setRequestProperty("Cookie", cookieString); 
    
相關問題