我对使用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
答案 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
我仍然没有发生这种情况的原因。但是,我有一个变通办法,可以使它正常工作。
我所做的是,我决定根本不在标题中设置“ 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',
]
}