NodeJS: Библиотека запросов - Как правильно использовать userQueryString? - PullRequest
0 голосов
/ 15 января 2020

В документации запроса задокументирован параметр "useQuerystring" со следующим:

useQuerystring - if true, use querystring to stringify and parse querystrings, otherwise use qs (default: false). Set this option to true if you need arrays to be serialized as foo=bar&foo=baz instead of the default foo[0]=bar&foo[1]=baz.

API, с которым я работаю, должен отправить более одного значения одному и тому же имя параметра; который этот параметр, кажется, заявляет, может быть сделано при использовании useQueryString, но я не могу понять, где / как передать строку запроса, чтобы она правильно обрабатывалась и в каком формате это делать.

например, я Я пробовал несколько разных мест для строки запроса в следующем коде:

let options = {
    uri: "https://api.mysite.com"[0],
    headers: {
        'Authorization': 'Bearer TOKEN_VALUE'
    },
    json: true,
    useQuerystring: true,
    querystring: "foo=bar&foo=baz",
    qs: "foo=bar&foo=baz",
    proxy: "http://localhost:8080",
    strictSSL: false,

};

request.get(options);

Когда я передаю строку запроса в параметре «строка запроса», он игнорирует ее (Ака, кажется, это неправильно пятно, место). Когда я помещаю это в "нормальное" пятно "qs"; В итоге я получаю URL-адрес следующего, который отправляется на сервер:

"?0=f&1=o&2=o&3=%3D&4=b&5=a&6=r&7=%26&8=f&9=o&10=o&11=%3D&12=b&13=a&14=z"

Как правильно передать строку запроса, если для useQuerystring задано значение true?

На основе следующий файл выглядит так, как будто он не меняет место строки запроса, поэтому я думаю, что это qs; но, как отмечено выше, это не работает: https://github.com/request/request/blob/master/lib/querystring.js

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 15 января 2020

Формулировка в документах немного вводит в заблуждение.

Когда он говорит использовать querystring , это означает, что модуль request будет использовать модуль querystring для построения параметра qs в качестве строки запроса. , Или что вы можете использовать querystring.parse (...) для анализа строки запроса к объекту, а затем передать этот объект параметру qs.

Я считаю, что это правильное использование для того, что вы пытается сделать:

const req = require('request');

const opts = {
    foo: 'bar',
    bar: 'foo',
    arr: ['foo', 'bar', 'etc']
};

const apiOptions = {
    uri: 'http://testyurl.com',
    headers: {},
    json: true,
    useQuerystring: true,
    qs: opts
};

req.get(apiOptions);

//This yields: http://testyurl.com/?foo=bar&bar=foo&arr=foo&arr=bar&arr=etc

Если не установить параметр useQuerystring: true, получится что-то странное, как вы видели:

http://testyurl.com/?foo=bar&bar=foo&arr%5B0%5D=foo&arr%5B1%5D=bar&arr%5B2%5D=etc

Поскольку запрос пытается выйти из arr [0 ], arr [1] и arr [2] в URL.

Также опция:

const opts = {
    foo: 'bar',
    bar: 'foo',
    arr: ['foo', 'bar', 'etc']
};

const querystring = require('querystring');
const uri = 'http://testyurl.com' + querystring.stringify(opts);

// yields: http://testyurl.comfoo=bar&bar=foo&arr=foo&arr=bar&arr=etc
0 голосов
/ 15 января 2020

Вам необходимо передать строку запроса как объект пар ключ-значение. Я только что проверил это работает.

const opts = {
  url: "https://api.mysite.com"[0],
  headers: {
    'Authorization': 'Bearer TOKEN_VALUE'
   },
  qs: {
    foo: 'bar',
    ha: 'ra'
  }
}
request.get(opts, function(err, data) {
  if (err) {
    throw err
  }
  console.log(data)
})
...