Функция запроса Node.js добавляет косую черту в URL - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь использовать node.js для вызова https://api.umd.io/v0/courses?dept_id=math, но когда я вызываю функцию запроса следующим образом:

var request = require('request');
request('http://api.umd.io/v0/courses?dept_id=math', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
...

Добавляется косая черта, в результате чего запрос переходит к https://api.umd.io/v0/courses?dept_id=math/, который возвращается пустым. Есть ли способ, чтобы косая черта не была добавлена? Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Кажется, что на хост-сайте есть ошибки. Есть два способа обойти это, но если хост-сайт - это ваш код, вам нужно просто исправить эти ошибки в коде сервера.

  1. Если вы переключитесь на https, то это сработает. Я заметил это, потому что, если вы вводите http://api.umd.io/v0/courses?dept_id=math в браузер, он перенаправляет на https://api.umd.io/v0/courses?dept_id=math и работает. Если посмотреть на вкладку «Сеть» браузера, отклик 307 с перенаправлением на https-версию URL-адреса. Node.js также получает перенаправление, но не такое, как в браузере (подробнее об этом ниже). Таким образом, переключение на https позволяет избежать ошибочного перенаправления, которое добавляет / в конец URL-адреса. Это, вероятно, безопасный обходной путь.

  2. Если вы добавите & в конец URL, будет работать обычная версия http URL. Это явный признак того, что это какая-то ошибка синтаксического анализа URL-адреса сервера, вызывающая проблему. Это, вероятно, не особенно безопасный обходной путь, потому что несколько случайно работает перенаправленный URL (см. Обсуждение ниже).


Когда я продолжу исследование в своем собственном приложении node.js, я обнаружу, что если вы установите опцию request() followRedirect: false, то вы сможете точно увидеть, что происходит с перенаправлением. В этом случае он дает вам перенаправление 301 на https://api.umd.io/v0/courses?dept_id=math/ с косой чертой в конце. Это просто ошибка сервера. Вам придется либо исправить это на сервере, либо воспользоваться одним из описанных выше способов обхода.

Все это было проверено в простом тестовом приложении node.js. Для перенаправления, похоже, сервер каким-то образом обнаруживает, что это браузер, и отправляет перенаправление, если это браузер, но не в коде вашего node.js. Я посмотрел на браузер и только четыре заголовка отправляются с запросом:

DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id: CD54EC492DF97F6357AFC5465E6D6D0C

По причинам, я не понимаю браузер, получает перенаправление 307 на https://api.umd.io/v0/courses?dept_id=math, который является правильным URL. Я не знаю, почему node.js перенаправляет 301 на неправильный URL, а браузер перенаправляет 307 на правильный URL. Я попытался смоделировать все заголовки, которые отправлял браузер, и все равно получил 301 по неверному URL.


В любом случае, у вас есть два возможных обходных пути, которые работают с node.js. Интересно, что добавление & в конец все еще получает перенаправление с /, добавленным в конец, как в:

https://api.umd.io/v0/courses?dept_id=math&/

, но использование этого URL-адреса перенаправления действительно работает, вероятно, потому что & запускает разбор URL-адреса, чтобы поместить / в другой сегмент xxx = yy URL-адреса, отделяющий его от сегмента dept_id=math, чтобы он не мешал что до. Это показывает, что добавление & - это просто взлом, который приводит к некоторой случайной работе ошибки сервера. Я бы не посчитал это надежным обходным решением, которое может случайно не сломаться в будущем.

0 голосов
/ 31 августа 2018

Поместите амперсанд в конец URL-адреса следующим образом:

var request = require('request');
request('http://api.umd.io/v0/courses?dept_id=math&', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
})

Это было проверено на новой установке npm запроса. Я смог повторить ошибку, оставив ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...