GET-запрос работает через Postman, но браузер сообщает, что GET-запрос не может иметь тела - PullRequest
0 голосов
/ 16 апреля 2020

Я просто пытаюсь отправить некоторые параметры urlencoded через GET-запрос, используя fetch. Я просто пытаюсь напечатать параметры, используя Express на данный момент, например так:

app.get('/api', function (req, res) {
    console.log(req.body);
    res.sendStatus(200);
    return;
});

Это прекрасно работает в Postman с использованием пар GET-запроса и x- www-form-urlencoded ключ-значение. Веб-сервер будет печатать все пары ключ-значение просто отлично.

Но когда я пытаюсь использовать fetch, чтобы сделать то же самое, я получаю только проблемы. Я пробовал два разных метода:

fetch(`http://localhost:3000/api?user=test&password=123`, {
    headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
    }
});

Запрос выполняет go с помощью этого метода, но веб-сервер печатает только {} - пустой объект.

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");

var urlencoded = new URLSearchParams();
urlencoded.append("user", "test");
urlencoded.append("password", "123");

var requestOptions = {
    method: 'GET',
    headers: myHeaders,
    body: urlencoded,
};

fetch("localhost:3000/api", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Запрос не go при использовании этого метода, и браузер выдает мне ошибку TypeError: Window.fetch: HEAD or GET Request cannot have a body.
Этот код был сгенерирован с использованием запроса , который работает в Postman с использованием параметра создания фрагментов кода.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы путаете тело запроса со строкой запроса.

Ваш второй запрос (для него не требуется Content-Type)

fetch("http://localhost:3000/api?user=test&password=123");

будет обработан следующая Express функция:

app.get('/api', function (req, res) {
    console.log(req.query); // Note that query, not body is used.
    res.sendStatus(200);
    return;
});

Вы можете получить доступ к полям из объекта запроса как req.query.user && req.query.password.

Что касается наличия тела запроса в запросе GET : в то время как RF C явно не запрещает это, он требует, чтобы сервер не изменял ответ, основываясь на содержимом тела, то есть тело в GET не имеет значения в стандарте, поэтому JS HTTP API (оба fetch & XmlHttpRequest) отрицают это.

1 голос
/ 16 апреля 2020

Параметры в этом URL:

http://localhost:3000/api?user=test&password=123

находятся в строке запроса, а не в теле, и поэтому content-type не применяется к ним - они правильно закодированы, чтобы быть в URL. В Express вы получите доступ к ним с помощью req.query. Вы должны увидеть значение для req.query.user и req.query.password в обработчике запросов Exprss.

Обратите внимание, что не рекомендуется отправлять учетные данные пользователя в URL-адресе, подобном этому, поскольку URL-адреса часто присутствуют в файлах журналов на ваш провайдер, на сервере получателя, в прокси, в истории браузера и т. д. c ... Подобные учетные данные пользователя следует отправлять в запросе POST через https, где учетные данные будут go закодированы в теле (где он выиграл) не могут быть зарегистрированы или сохранены посредниками).

Ошибка выборки точна. У запросов GET нет тела, отправленного с ними. Это было бы для запросов POST или PUT. GET-запрос - это запрос «get» для ресурса, который вы указываете только с помощью URL.

...