Я пытаюсь определить, является ли это ошибкой, что функция Python urllib.urlopen() пропускает заголовок HTTP Accept при выполнении простых запросов API REST.
API-интерфейс Facebook, кажется, замечает, присутствует ли заголовок или нет:
GET /zuck HTTP/1.0
Host: graph.facebook.com
Accept: */*
Без заголовка accept возвращаемый тип содержимого application/json; charset=UTF-8
становится text/javascript; charset=UTF-8
. Это может быть ошибкой в API REST Facebook или может быть законным ответом на отсутствующий заголовок принятия.
Я заметил, что инструменты командной строки, такие как curl, используют Accept: */*
по умолчанию:
$ curl -v https://graph.facebook.com/zuck
> GET /zuck HTTP/1.1
> User-Agent: curl/7.30.0
> Host: graph.facebook.com
> Accept: */*
Аналогично, пакет Python запросов также использует Accept: */*
по умолчанию:
def default_headers():
return CaseInsensitiveDict({
'User-Agent': default_user_agent(),
'Accept-Encoding': ', '.join(('gzip', 'deflate')),
'Accept': '*/*',
'Connection': 'keep-alive',
})
Я предполагаю, что завиток и запросы добавляют по умолчанию по какой-то причине, но я не уверен, что это за причина.
RFC 2616 для HTTP/1.1 говорит, что */* indicates all media types
и if no Accept header field is present, then it is assumed that the client accepts all media types
. Это, по-видимому, указывает на то, что Accept: */*
является необязательным, и его упущение не будет иметь никакого эффекта. Тем не менее, Python использует HTTP/1.0, и RFC молчат о влиянии опущения заголовка.
Я хотел бы определить, следует ли использовать Accept: */*
как curl, а запросы делать или это нормально опустить, как это делает Python urllib.urlopen().
Вопрос важен, потому что я могу исправить urllib.urlopen(), если он определен как ошибочный или если он проблематичен для использования с API-интерфейсы REST, обычно используемые с использованием HTTP/1.0:
>>> import httplib
>>> httplib.HTTPConnection.debuglevel = 1
>>> import urllib
>>> u = urllib.urlopen('https://graph.facebook.com/zuck')
send: 'GET /zuck HTTP/1.0\r\nHost: graph.facebook.com\r\nUser-Agent: Python-urllib/1.17\r\n\r\n'
Связанные с этим вопросы по StackOverflow не подходят для этого вопроса. Что означает "Принять: */*" в разделе "Клиент" заголовков запроса? спрашивает, что означает */*
(мы уже знаем, что это означает все типы носителей) и Отправить запрос на завивание без заголовка Accept? спрашивает, как опустить заголовок accept в запросе curl. Мой вопрос фокусируется на том, следует ли включать */*
и является ли это ошибкой, чтобы опустить его.