HTTP 403 при выполнении запроса PUT

Я создаю API для отдыха django и пытаюсь отправить данные JSON через запрос PUT с устройства Android, используя HttpUrlConnection.

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, который говорит, что файл cookie csrf имеет такое же значение.

V/Apiput﹕ csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx

Я получаю ошибку 403 (Forbidden) Http, кроме того, что пользователь аутентифицирован (я могу делать запросы GET)

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

С помощью curl я могу без проблем отправить запрос с теми же учетными данными пользователя.

Интересно, может ли кто-нибудь сказать мне, что я делаю неправильно.

Спасибо.


person Artur Ataíde    schedule 25.09.2015    source источник
comment
Попробуйте удалить ; charset=UTF-8 из ContentType. У меня были проблемы с выбором правильного синтаксического анализатора DRF, когда он является частью ContentType.   -  person Daniel Backman    schedule 20.01.2016


Ответы (1)


Вам не нужно устанавливать файл cookie, если вы выполняете вызов JSON для среды Django REST. Было бы определенно полезно, если бы вы могли предоставить разрешения, связанные с представлением.

person Linovia    schedule 29.09.2015
comment
У меня есть ApiView с методами GET, PUT и POST с разрешением isAuthenticated. Я могу получить доступ к методу GET, но не могу получить доступ к PUT и POST. Я даже пытался изменить разрешение на AllowAny, но все равно не повезло. - person Artur Ataíde; 29.09.2015