Node-Fetch API ПОЛУЧИТЬ с заголовками

#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');