【发布时间】:2015-12-23 20:06:10
【问题描述】:
我正在创建一个 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
除了用户经过身份验证之外,我收到 403(禁止)Http 错误(我可以发出 GET 请求)
[26/Sep/2015 00:16:04]"PUT /api/works/34/ HTTP/1.1" 403 58
使用 curl 我可以毫无问题地使用相同的用户凭据发送请求。
我想知道是否有人可以告诉我我做错了什么。
谢谢。
【问题讨论】:
-
尝试从 ContentType 中删除 "; charset=UTF-8"。当 DRF 是 ContentType 的一部分时,我在选择正确的解析器时遇到了问题。
标签: java rest csrf httpurlconnection http-put