Я экспериментировал с драгоценным камнем Ruby rest-client и столкнулся с "проблемой", чтобы говорить. Я заметил, что когда я нажимал определенный URL-адрес, который должен просто возвращать HTML, я получал ошибку 404, если специально не указывал:
RestClient.get('http://www.example.com/path/path', accept: 'text/html')
Однако практически любая другая страница, на которую я попаду без явного указания заголовка Accept
, прекрасно вернет HTML.
Я посмотрел исходный код объекта Request
, расположенный здесь. и в методе default_headers
вокруг строки 486 видно, что заголовок Accept
по умолчанию равен */*
. Я также нашел соответствующий запрос на вытягивание здесь.
Я не совсем понимаю, почему на конкретном сайте (не на всех) я должен явно указывать Accept: text/html
, когда любой другой сайт, возвращающий HTML по умолчанию, делает это без дополнительной работы. Я должен отметить, что другие страницы на этом же сайте работают нормально при запросе страницы без явного указания text/html
.
Это не большая проблема, и я могу легко обойти ее, используя text/html
, но я просто подумал, что это немного странно.
Я должен также отметить, что когда я использую другой клиент REST, например, встроенный в IntelliJ, и указываю Accept: */*
, он возвращает HTML без проблем...
РЕДАКТИРОВАТЬ: Хорошо, это немного странно... когда я делаю это:
RestClient.get('http://www.example.com/path/path', accept: '*/*')
Затем он возвращает HTML, как я и ожидал, но отключение этого параметра accept: */*
не работает, хотя по умолчанию этот заголовок должен быть */*
в соответствии с исходным кодом...
Интересно, поскольку в моем URL-адресе есть /path/path
, RestClient думает, что это конечная точка для какого-то API, поэтому вместо этого пытается получить XML...
РЕДАКТИРОВАТЬ 2: Немного поэкспериментировать... Мне удалось передать блок в запрос GET следующим образом:
RestClient.get('http://example.com/path/path') {
|response, request, result|
puts response.code
puts request.processed_headers
}
И я получаю ошибку 404
, и возвращается processed_headers
:
{"Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate"}
Тело ответа выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<errors>Not Found</errors>
</hash>
Итак, он отправляет заголовок */*
, но по какой-то причине кажется, что application/xml
имеет приоритет. Может быть, это просто что-то на стороне сервера и не под моим контролем? Думаю, я просто не уверен, как это application/xml
вообще добавляется в заголовок Accept
. Я не могу найти ничего, просматривая исходный код.