Повар ie не отправляется при запросе - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в веб-разработке с API. Итак, у меня есть функция, которая отправляет запрос на сервер с приведенным ниже кодом. Он отправляется вместе с токеном, который я храню в cook ie.

var myHeaders = new Headers();
        myHeaders.append("Content-Type", "application/json");
        myHeaders.append("Content-Type", "text/plain");

        var raw = "{\n    \"latitude\": \"69.23489236336972000\",\n    \"longitude\": \"-69.08944702148439000\",\n    \"log_start\": \"2020-05-03T09:37:41Z\",\n    \"log_end\": \"2020-05-03T10:00:00Z\"\n}";

        var requestOptions = {
            method: 'POST',
            headers: myHeaders,
            body: raw,
            redirect: 'follow',
            credentials: 'include',
        };

        fetch("http://127.0.0.1:8000/logs/log/", requestOptions)
            .then(response => response.json())
            .then(result => console.log(result))
            .catch(error => console.log('error', error));


Однако я продолжаю получать эту ошибку, когда пытаюсь ее отправить.
https://i.stack.imgur.com/StU0q.png
Немного покопавшись, я замечаю, что мой повар ie не отправляется с запросом (как показано на картинке ниже). Это довольно странно для меня, потому что я установил "учетные данные" на "включить" в requestOptions.

https://i.stack.imgur.com/Hp1mi.png

Однако, когда я комментирую строки, которые добавляют «Content-Type» к заголовку, так что заголовок становится пустым. Повар ie снова включен в заголовок вместе с другими заголовками, которые не были включены в первую очередь.

var myHeaders = new Headers();
        // myHeaders.append("Content-Type", "application/json");
        // myHeaders.append("Content-Type", "text/plain");

        var raw = "{\n    \"latitude\": \"69.23489236336972000\",\n    \"longitude\": \"-69.08944702148439000\",\n    \"log_start\": \"2020-05-03T09:37:41Z\",\n    \"log_end\": \"2020-05-03T10:00:00Z\"\n}";

        var requestOptions = {
            method: 'POST',
            headers: myHeaders,
            body: raw,
            redirect: 'follow',
            credentials: 'include',
        };

        fetch("http://127.0.0.1:8000/logs/log/", requestOptions)
            .then(response => response.json())
            .then(result => console.log(result))
            .catch(error => console.log('error', error));

https://i.stack.imgur.com/JJNbB.png

Но если я не установлю «Content-Type» в «application / json», я получу ошибку «415 Unsupported Media Type».

Кто-нибудь знает, почему это? А как исправить?
Заранее благодарю.


У меня недостаточно репутации для публикации изображений, поэтому я прикрепил их как url ​​

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Обновление

Я забыл обновить это, но я нашел решение для этого. Файлы cookie не должны отправляться во время предполетных рейсов. В вашем бэкэнде вы должны предоставить разрешение на предполетные операции (в частности, HTTP OPTIONS). В моем случае я использую Django с django -rest-framework, поэтому мой пример решения будет выглядеть так.

class PreflightsOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.method == "OPTIONS"


class LogAPI(generics.GenericAPIView):

    queryset = Log.objects.all()
    permission_classes = [PreflightsOnly|permissions.IsAuthenticated]
    serializer_class = LogSerializer


Комментарий от 5 мая

У меня до сих пор нет причины, почему это происходит. Однако у меня есть обходной путь, который позволяет мне заставить его работать.

Что я сделал, так это то, что я решил вообще не устанавливать «Content-Type» в заголовке. Поэтому мне пришлось придерживаться значения по умолчанию «Content-Type: text / plain; charset = UTF-8». Итак, чтобы это сработало, я создал собственный парсер, который принимает этот «Content-Type».

from rest_framework.parsers import BaseParser
import ast

class PlainTextParser(BaseParser):

    """
    Plain text parser.
    """
    media_type = 'text/plain;charset=UTF-8'

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Simply return a string representing the body of the request.
        """
        byte_str = stream.read()
        dict_str = byte_str.decode("UTF-8")
        data = ast.literal_eval(dict_str)

        return data



Затем внутри "settings.py" моего Django приложения я устанавливаю REST_FRAMEWORK DEFAULT_PARSER_CLASSES следующим образом:

REST_FRAMEWORK = {
    ...,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_customs.parsers.PlainTextParser',
    ]
}
0 голосов
/ 05 мая 2020

Для начала я бы посоветовал настроить политику cors для вашего сервера, потому что, когда вы устанавливаете Content-Type, вы получаете эту ошибку. -Тип: обычный / текстовый. Итак, возможно, ваш сервер по этому запросу может работать только с данными json, а не с текстом, поэтому вы получите ошибку. Но это только мои предположения

...