2015-09-25 574 views
1

我正在創建一個django rest api,並且我正嘗試使用HttpUrlConnection通過來自Android設備的PUT請求發送JSON數據。執行PUT請求時的HTTP 403

URL url = new URL(myurl); 
conn = (HttpURLConnection) url.openConnection(); 
conn.setReadTimeout(10000 /* milliseconds */); 
conn.setConnectTimeout(15000 /* milliseconds */); 
conn.setRequestMethod("PUT"); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
conn.setRequestProperty("Accept", "application/json"); 
Log.v("Apiput", MainActivity.cookieManager.getCookieStore().getCookies().get(0).toString()); 
conn.connect(); 
if(conn.getResponseCode() != 200) { 
    return "" + conn.getResponseCode(); 
} 
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream()); 
osw.write(put); 
osw.flush(); 
osw.close();` 

我知道我必須發送一個csrf令牌,但我認爲我已經發送了它。 通過我的要求檢查META我可以看到CSRF無論是在頭和cookie標記:

'HTTP_COOKIE': 'csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx;'

而且在我的Android設備,我有那麼CookieManager,指出CSRF餅乾有相同的值。

V/Apiput﹕ csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx

我得到一個403(禁止)HTTP錯誤之外的用戶進行身份驗證(我可以讓GET請求)

[26/Sep/2015 00:16:04]"PUT /api/works/34/ HTTP/1.1" 403 58

,捲曲我能夠發送請求,而不任何問題,具有相同的用戶憑據。

我想知道有沒有人能告訴我我做錯了什麼。

謝謝。

+0

嘗試從ContentType中刪除「; charset = UTF-8」。當DRF是ContentType的一部分時,我遇到了DRF挑選正確解析器的問題。 –

回答

0

如果您正在對Django REST框架執行JSON調用,則不必設置cookie。 如果您可以提供與該視圖相關的權限,它將明確地提供幫助。

+0

我有一個ApiView與GET,PUT和POST方法,具有isAuthenticated權限。我可以訪問GET方法,但不能訪問PUT和POST。我甚至試圖將AllowAny的權限改變,但仍然沒有運氣。 –