Кажется, что на хост-сайте есть ошибки. Есть два способа обойти это, но если хост-сайт - это ваш код, вам нужно просто исправить эти ошибки в коде сервера.
Если вы переключитесь на 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-адреса. Это, вероятно, безопасный обходной путь.
Если вы добавите &
в конец 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
, чтобы он не мешал что до. Это показывает, что добавление &
- это просто взлом, который приводит к некоторой случайной работе ошибки сервера. Я бы не посчитал это надежным обходным решением, которое может случайно не сломаться в будущем.