POST-запрос почтальона не работает в nodejs (доступ к стороннему API) - PullRequest
0 голосов
/ 14 сентября 2018

Я немного поигрался с сетью, но столкнулся с проблемой, которую не могу понять;Используя сервер nodejs (на моем локальном компьютере), я не могу получить сообщение об ошибке разрешения, запрещающее мне доступ к данным.Что меня больше всего смущает, так это то, что при использовании расширения chrome «Почтальон» я не сталкиваюсь с ошибками разрешений, но использую код, сгенерированный почтальоном, (как и с изменением собственного кода).

Нужно ли использовать живой сервер?Нужно ли включать в заголовки некоторые дополнительные элементы, которые не помещаются там почтальоном?Есть ли какой-то уровень безопасности вокруг API, который по какой-то причине у Postman есть доступ, который недоступен для локальной машины?

Будет полезен любой свет, который можно пролить.Обратите внимание, что нет общедоступной документации API-интерфейса SmithsFoodAndDrug (которую я могу найти), поэтому не обязательно использовать APIKeys.Но тот факт, что Почтальон может получить доступ к информации, заставляет меня думать, что я должен иметь возможность на сервере узла без какой-либо специальной настройки аутентификации.

В заключение:

  1. Я ищув информации о продукте SmithsFoodAndDrug и нашел API, из которого они получают информацию.
  2. Я выяснил, какие заголовки нужны для получения локальной информации о ценах на продукты (поверх формата тела json для запроса POST)
  3. Используя почтальон, я могу сгенерировать запрос POST и получить желаемые результаты API
  4. Используя nodejs (и код, сгенерированный почтальоном для репликации запроса) с модулем 'request' и стандартным 'http'модуль запроса модуля Я получаю ошибки разрешения от сервера.

Подробности: (предположим, сбор данных о яблоках honeycrisp (0000000003283) с идентификатором деления 706 и идентификатором хранилища 00144)

  1. http://www.smithsfoodanddrug.com/products/api/products/details
  2. Заголовками являются «идентификатор подразделения» и «идентификатор магазина».Тело имеет формат {"upcs": ["XXX"], "filterBadProducts": false}, где XXX - это код конкретного продукта.
  3. Вот Заголовки запроса в почтальоне.Вот настройки Тело запроса в почтальоне.Ниже приведен фрагмент ответа json (именно это я и хочу).

    {"products": [
        {
            "brandName": null,
            "clickListItem": true,
            "countryOfOrigin": "Check store for country of origin details",
            "customerFacingSize": "price $2.49/lb",
            ...
            "calculatedPromoPrice": "2.49",
            "calculatedRegularPrice": "2.99",
            "calculatedReferencePrice": null,
            "displayTemplate": "YellowTag",
            "division": "706",
            "minimumAdvertisedPrice": null,
            "orderBy": "Unit",
            "regularNFor": "1",
            "referenceNFor": "1",
            "referencePrice": null,
            "store": "00144",
            "endDate": "2018-09-19T00:00:00",
            "priceNormal": "2.55",
            "priceSale": "2.12",
            "promoDescription": "About $2.12 for each",
            "promoType": null,
            ...
            "upc": "0000000003283",
            ...
        }
    ],
    "coupons": {},
    "departments": [],
    "priceHasError": false,
    "totalCount": 1 }
    
  4. При использовании кода, переданного почтальоном для репликации запроса, я получаю сообщение об ошибке:У вас нет разрешения для доступа "http://www.smithsfoodanddrug.com/products/api/products/details" на этом сервере. Ссылка # 18.1f3de93f.1536955806.1989a2b1. '.

    // Code given by postman
    var request = require("request");
    
    var options = { method: 'POST',
      url: 'http://www.smithsfoodanddrug.com/products/api/products/details',
      headers: 
       { 'postman-token': 'ad9638c1-1ea5-1afc-925e-fe753b342f91',
         'cache-control': 'no-cache',
         'store-id': '00144',
         'division-id': '706',
         'content-type': 'application/json' },
      body: { upcs: [ '0000000003283' ], filterBadProducts: false },
      json: true };
    
    request(options, function (error, response, body) {
      if (error) throw new Error(error);
    
      console.log(body);
    });
    

1 Ответ

0 голосов
/ 15 сентября 2018

изменение headers

    headers: 
       { 
         'store-id': '00144',
         'division-id': '706'
//'content-type': 'application/json'
    }
...