2015-09-25 114 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的权限改变,但仍然没有运气。 –