Ответ REST API с 400 ошибочным запросом, когда заголовок Content-length вводится в POST - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть веб-сайт и питон RESTFUL API.При тестировании API с Postman он работает просто отлично, но тот же запрос с использованием XMLHttprequest в js дает мне код запроса 400 BAD.Я посмотрел на заголовки отправки и реплицировал заголовки XMLHttprequest в Postman, чтобы получить код 400 BAD REQUEST.Если я удаляю заголовок Content-Length из запроса, он работает нормально.Код моего почтальона (HTML, без длины содержимого):

POST /user/181453766040485888 HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: multipart/form-data; boundary=--- 
-WebKitFormBoundary7MA4YWxkTrZu0gW
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keeep-alive
Host: 127.0.0.1:5000
Origin: http://localhost:52014
Referer: http://localhost:52014/settings.php
User-Agent: Mozilla/5.0 (Windows NT 10.0; 
Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.106 (Edition Campaign 76)
cache-control: no-cache
Postman-Token: 5dd34b0b-965c-4d31-83b9-2364b03c0aa2

Content-Disposition: form-data; name="status"

0

Content-Disposition: form-data; name="username"

0

Content-Disposition: form-data; name="token"

0

Content-Disposition: form-data; name="display_names"

1

Content-Disposition: form-data; name="messages"

1

Content-Disposition: form-data; name="roles"

1

Content-Disposition: form-data; name="votes"

1
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Моя функция js (для тестирования):

function save() {
        var formData = new FormData();
        formData.append("status", 0);
        formData.append("username", 0);
        formData.append("token", 0);
        formData.append("display_names", 0);
        formData.append("messages", 0);
        formData.append("roles", 0);
        formData.append("votes", 0);

        const Http = new XMLHttpRequest();
        const url='http://127.0.0.1:5000/user/181453766040485888';
        Http.open("POST", url);
        Http.onreadystatechange=(e)=>{
            console.log(Http.responseText)
        }
        Http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        Http.send(formData);
    }

Моя функция API, которая обрабатывает запрос (аннотация):

def post(self, id):
    if database.execute(database.SAVE_USER_SETTINGS.format(id, request.form["status"], request.form["username"],
                                                        request.form["token"], request.form["display_names"],
                                                        request.form["messages"], request.form["roles"],
                                                        request.form["votes"])):
        return (id, request.form["status"], request.form["username"],
                    request.form["token"], request.form["display_names"],
                    request.form["messages"], request.form["roles"],
                    request.form["votes"]), 201

    return {}, 500
...