执行PUT请求时的HTTP 403

时间:2015-09-25 22:25:51

标签: java rest csrf httpurlconnection http-put

我正在创建一个django rest api,我正在尝试使用HttpUrlConnection从Android设备通过PUT请求发送JSON数据。

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,我可以在头文件和cookie中看到csrf令牌:

'HTTP_COOKIE': 'csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx;'

在我的Android设备中,我有一个CookieManager,表示csrf cookie具有相同的值。

V/Apiput﹕ csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx

除了用户通过身份验证(我可以进行GET请求)之外,我收到了403(禁止)Http错误

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

使用curl,我可以使用相同的用户凭据毫无问题地发送请求。

我想知道是否有人能告诉我我做错了什么。

感谢。

1 个答案:

答案 0 :(得分:0)

如果您正在对Django REST框架进行JSON调用,则不必设置cookie。 如果您可以提供与视图关联的权限,那么它肯定会有所帮助。