我构建了一个API,使用Django 2和Django Rest Framework。所有get方法都可以,首先使用身份验证来接收令牌并使用此令牌访问所有其他方法。唯一的问题是我唯一接收POST数据的功能。
问题是这个POST方法的调用总是返回,甚至提供“授权”令牌,这条消息:
“{”detail“:”未提供身份验证凭据。“}
有趣的是,在POSTMAN中它有效!另一位开发人员尝试使用JavaScript,它总是返回此消息。我尝试使用PHP使用CURL发出POST请求并给出相同的错误。只需使用POSTMAN即可...
这是我在settings.py中的Django Rest Framework设置:
INSTALLED_APPS = [
...
'rest_framework.authtoken',
...
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
这是在views.py:
中称为trought API的方法@api_view(['POST'])
def api_inventory_sector_items_check(request, branch_id, inventory_id, sector_id):
# Do something
这是url.py:
# ...
from rest_framework.urlpatterns import format_suffix_patterns
# ...
urlpatterns = [
...
path('.../check', # See the long URL bellow
views.api_inventory_sector_items_check,
name='app.api.inventory_sector_items_check'),
]
# ...
所以我试图使用POST调用:
{{域}} /应用/ API / V1 /分支/ 1 /库存/ 2 /扇区/ 100101329 /项目/检查
'Content-Type:application / json'
'授权:令牌令牌efad3303547374b7c035499218ad5d0cceb03178'
并且在帖子中张贴了一些数据......
正如我之前所说,使用POSTMAN一切都没问题。但是当我们尝试通过任何其他“方法”提交此帖子时,它会返回相同的消息。细节:使用相同的HEADER,但对于GET请求,一切正常。
使用返回“...未提供凭据”的PHP的请求示例。
<?php
$data = array(
"data"=>"{'id':'20012738', 'obs': '', 'resp':'325880','final':1}",
);
$data_string = json_encode($data);
$ch =
curl_init('http://localhost/app/api/v1/branches/1/
inventories/7/sectors/100162162/items/check');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string)),
'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178'
);
$result = curl_exec($ch);
echo $result;
?>
有人可以帮帮我吗?非常感谢你!
答案 0 :(得分:1)
你有一个微妙的错字:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string)),
'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178'
);
array()
在添加Authorization
标头之前结束(请注意内容长度标题末尾的右括号)。这将阻止令牌正确传输,并可能导致身份验证错误。
更改为:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178')
);
答案 1 :(得分:1)
我提交的PHP代码错误,Will Kelling会帮助我。谢谢。无论如何,为Django Rest API提交POST数据都没有回复数据......我通过使用解决了这个问题:
request.body
而不是
request.POST.get('data')
然后,我的代码变成这样:
@api_view(['POST'])
def api_inventory_sector_items_check(request, branch_id, inventory_id, sector_id):
try:
sector_items = request.body
except Exception:
return Response({"detail": "No data received or isn't a JSON data"}, status=status.HTTP_406_NOT_ACCEPTABLE)
try:
sector_items = json.loads(sector_items)
except json.JSONDecodeError or TypeError:
return Response({
'detail': "Data received has a wrong format. This is not a JSON var."
}, status=status.HTTP_404_BAD_REQUEST)