#node.js #api
#node.js #API
Вопрос:
https://www.npmjs.com/package/node-fetch Узел v6.4.0 npm v3.10.3
Я хочу отправить запрос GET с пользовательскими заголовками в этом вызове API.
const fetch = require('node-fetch')
var server = 'https://example.net/information_submitted/'
var loginInformation = {
username: "example@example.com",
password: "examplePassword",
ApiKey: "0000-0000-00-000-0000-0"
}
var headers = {}
headers['This-Api-Header-Custom'] = {
Username: loginInformation.username,
Password: loginInformation.password,
requiredApiKey: loginInformation.ApiKey
}
fetch(server, { method: 'GET', headers: headers})
.then((res) => {
console.log(res)
return res.json()
})
.then((json) => {
console.log(json)
})
Заголовки не применяются, мне отказано в доступе.
Но в команде curl это работает отлично.
Комментарии:
1. Вы пробовали использовать нижний регистр для имен заголовков? Спецификация выборки предлагает вам сделать: https://fetch.spec.whatwg.org/#terminology-headers Также: попробуйте этот инструмент curl — fetch converter: https://kigiri.github.io/fetch /
2. @Herald,
cURL -> Fetch
конвертер, который вы предлагаете, имеет низкую функциональность. Передаются только заголовки. Все остальное, любые другиеcURL
варианты игнорируются.
Ответ №1:
Давайте воспользуемся этой командой bash netcat -lp 8081
и временно изменим URL на http://localhost:8081/testurl
. Теперь запрос все равно завершится ошибкой, но наша консоль показывает некоторые необработанные данные запроса:
user@host:~$ netcat -lp 8081
GET /testurl HTTP/1.1
accept-encoding: gzip,deflate
user-agent: node-fetch/1.0 ( https://github.com/bitinn/node-fetch)
connection: close
accept: */*
Host: localhost:8081rn
rn
Эти два rn
являются фактически невидимыми CRLF, говорится в спецификации, они отмечают конец заголовков и начало тела запроса. Вы можете увидеть дополнительную новую строку в своей консоли.
Теперь, если вы хотите, чтобы это выглядело так:
user@host:~$ netcat -lp 8081
GET /testurl HTTP/1.1
username: example@example.com
password: examplePassword
requiredapikey: 0000-0000-00-000-0000-0
accept-encoding: gzip,deflate
user-agent: node-fetch/1.0 ( https://github.com/bitinn/node-fetch)
connection: close
accept: */*
Host: localhost:8081
тогда вам нужно только небольшое изменение:
// var headers = {}
//headers['This-Api-Header-Custom'] = {
var headers = {
Username: loginInformation.username,
Password: loginInformation.password,
requiredApiKey: loginInformation.ApiKey
}
fetch(server, { method: 'GET', headers: headers})
Но если вы хотите установить какой-то специальный заголовок This-Api-Header-Custom
, то вы не можете передавать вложенные объекты и массивы, но вам нужно сериализовать свои данные, т. Е. Превратить данные username / password / requiredApiKey в строку. В зависимости от ваших требований, это может быть, например, CSV, JSON, …
Ответ №2:
Я думаю, вам нужно использовать конструктор заголовков вместо простого объекта.
https://developer.mozilla.org/en-US/docs/Web/API/Headers
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Headers
myHeaders = new Headers({
"Content-Type": "text/plain",
"Content-Length": content.length.toString(),
"X-Custom-Header": "ProcessThisImmediately",
});
Комментарии:
1. Мне любопытно, откуда вы используете веб
Header
-интерфейс Node.js .2.
const { Headers } = require('node-fetch');