请求时未发送Cookie

时间:2020-05-05 05:34:41

标签: django reactjs cookies django-rest-framework fetch-api

我对使用API​​进行Web开发非常陌生。因此,我有一个使用以下代码将请求发送到服务器的函数。它与我存储在cookie中的令牌一起发送。

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

经过一番挖掘,我发现我的cookie没有随请求一起发送(如下图所示)。这对我来说很奇怪,因为我在requestOptions中将“凭据”设置为“包含”。

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

但是,当我注释掉将“ Content-Type”附加到标题的行时,以便标题变为空。 Cookie会再次包含在标题中,以及其他未包含在首位的标题中。

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 :(得分:0)

对于初学者来说,我建议您为服务器设置安装策略,因为在设置Content-Type时会出现此错误 当您不设置Content-Type时,您将其放入有效载荷应用程序/ json类型,但实际上是您的Content-Type:纯文本/文本。因此,也许您在此请求上使用的服务器只能使用json数据,而不能使用文本,因此会出现错误。但这只是我的假设

答案 1 :(得分:0)

更新

我忘了更新,但是我找到了解决方案。 Cookies不应在飞行前发送。在后端,您必须授予预检权限(特别是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月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



然后在我的Django应用程序的“ settings.py”中,我像这样设置REST_FRAMEWORK DEFAULT_PARSER_CLASSES:

REST_FRAMEWORK = {
    ...,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_customs.parsers.PlainTextParser',
    ]
}