Header php json: Returning JSON from a PHP Script
Содержание
Nomintaim возвращает HTML при запросе JSON в PHP
Тот же URL-адрес через веб-браузер возвращает JSON в точном соответствии. При попытке получить доступ через PHP-скрипт (file_get_content или curl) я получаю ответ в HTML при использовании «format = json» в URL-адресе. Я работаю с испанскими данными, и ответ правильный, но не в том формате, в котором я его запрашиваю.
Это происходит как с номинатимом, установленным локально, так и с публичным сервером с nominatim.openstreetmap.org. Я попробовал это, чтобы проверить, была ли это проблема моей установки. Ответы с одинаковыми параметрами идентичны на обоих серверах.
Я просмотрел документацию, и в вики упоминается, что общедоступный веб-сервис открыт, но необходимо правильно определить реферера или агента, чтобы он отвечал правильно. Я уверен, что копирую заголовок агента из заголовков запросов веб-браузера, но он остается прежним. До этого я получил предупреждение о том, что не могу найти заголовок агента в log. php от Nominatim, но после его добавления ошибка больше не появляется. Однако я все еще не получаю ответа JSON от scruipts. Во всяком случае, я не уверен, что проблема может быть в заголовках.
Кто-нибудь знает, какая конфигурация заголовка является правильной для получения json-ответа от PHP? Или мне нужно изменить какую-либо конфигурацию на моем сервере, чтобы получать ответы json от сценариев?
Заголовки веб-браузера (firebug)
Запрос:
- GET /nominatim/search.php?q=CALLE+POZO+SANTA+CATALINA+3+Ciudad+Real&format=json&addressdetails=1
- Хост HTTP/1.1: local.ip
- User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0
- Принять: text/html,application/xhtml+xml,application/xml;q=0,9, /;q=0,8
- Accept-Language: es-ES,es;q=0,8,en-US;q=0,5,en;q=0,3
- Accept-Encoding: gzip, deflate
- Файл cookie: PHPSESSID=guebk1lc2vu0ihaoedflmjhof1
- Соединение: поддержка активности
Также пробовал с nominatim. openstreetmap.org в качестве хоста и такое же поведение.
Ответ:
- HTTP/1.1 200 OK Дата: Среда, 28 октября 2015 г. 09:01:40 GMT
- Сервер: Apache/2.2.22 (Debian)
- X-Powered-By: PHP/5.4.4-14+deb7u14
- Доступ-Контроль-Разрешить-Происхождение: *
- методы разрешения-управления доступом: ОПЦИИ, ПОЛУЧИТЬ
- Варьировать: Accept-Encoding
- Кодировка содержимого: gzip
- Content-Length: 369 Keep-Alive: timeout=5, max=100
- Соединение: Keep-Alive
- Тип содержимого: application/json; кодировка = UTF-8
Заголовки Eclipse (отладка)
Запрос:
- ПОЛУЧИТЬ /nominatim/search.php?q=CALLE+POZO+SANTA+CATALINA+3+Ciudad Real&format=json&addressdetails=1 HTTP/1.1
- User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0
- Хост: local.ip
- Принять: */*
User-Agent копируется и устанавливается вручную из исходного HTTP-запроса в сценарии PHP. Если этого не сделать, Eclipse не отправляет заголовок пользовательского агента. Вот почему я подумал, что это может быть связано с заголовками, когда читал вики OSM об обслуживании.
Ответ:
- HTTP/1.1 200 OK Дата: среда, 28 октября 2015 г. 09:17:56 GMT
- Сервер: Apache/2.2.22 (Debian)
- X-Powered-By: PHP/5.4.4-14+deb7u14
- Доступ-Контроль-Разрешить-Происхождение: *
- Access-Control-Allow-Methods: ВАРИАНТЫ, ПОЛУЧИТЬ
- Варьировать: Accept-Encoding
- Соединение: закрыть
- Тип содержимого: текст/html; кодировка = UTF-8
Content-Disposition — HTTP | MDN
В обычном HTTP-ответе Content-Disposition
заголовок ответа — это заголовок, указывающий, ожидается ли отображение содержимого в строке в браузере, то есть как веб-страница или как часть веб-страницы, или как вложение , загружаемое и сохраняемое локально.
В теле multipart/form-data
общий заголовок HTTP Content-Disposition
является заголовком, который должен использоваться в каждой части составного тела для предоставления информации о поле, к которому он относится. Подчасть ограничена цифрой 9.0024 граница , определенная в заголовке
Content-Type
. Используемый на самом теле, Content-Disposition
не имеет никакого эффекта.
Заголовок Content-Disposition
определяется в более широком контексте сообщений MIME для электронной почты, но только часть возможных параметров применяется к формам HTTP и запросам POST
. В контексте HTTP можно использовать только значение form-data
, а также необязательную директиву name
и filename
.
Тип коллектора | Заголовок ответа (для основного тела), Заголовок запроса, Заголовок ответа (для части составного тело) |
---|---|
Запрещенное имя заголовка | нет |
В качестве заголовка ответа для основной части
Первый параметр в контексте HTTP — либо встроенный
(значение по умолчанию, указывающее, что он может отображаться внутри веб-страницы или как веб-страница), либо вложение
(указывает на то, что оно должно быть загружено; большинство браузеров представляют диалоговое окно «Сохранить как», предварительно заполненное значением параметров имени файла
, если они есть).
Content-Disposition: встроенный Content-Disposition: вложение Content-Disposition: вложение; имя_файла="имя_файла.jpg"
Примечание. Chrome и Firefox 82 и более поздние версии отдают приоритет атрибуту загрузки HTML-элемента по сравнению с параметром
Content-Disposition: inline
(для URL-адресов того же происхождения). Более ранние версии Firefox отдают приоритет заголовку и отображают содержимое в строке.
В качестве заголовка для составного тела
Для тела multipart/form-data
требуется заголовок Content-Disposition
для предоставления информации для каждой части формы (например, для каждого поля формы и любых файлов, которые являются частью данных поля). Первая директива всегда form-data
, а заголовок должен также включать параметр name
для идентификации соответствующего поля. Дополнительные директивы нечувствительны к регистру и имеют аргументы, использующие синтаксис строки в кавычках после 9. 0104 '=' Знак . Несколько параметров разделяются точкой с запятой (
';'
).
Content-Disposition: данные формы; имя = "имя поля" Content-Disposition: данные формы; имя="ИмяПоля"; имя_файла="имя_файла.jpg"
Директивы
-
Название
За ним следует строка
содержащий имя поля HTML в форме
к которому относится содержание этого подраздела.
При работе с несколькими файлами в одном поле
(например,множественный атрибут
элемента
может быть несколько подразделов с одинаковым названием.Имя
'_charset_'
указывает
что часть не является полем HTML,
но кодировка по умолчанию для частей без явной информации о кодировке.-
имя файла
За ним следует строка, содержащая исходное имя передаваемого файла.
Имя файла всегда является необязательным и не должно использоваться приложением вслепую: информация о пути должна быть удалена, а также должно быть выполнено преобразование в правила файловой системы сервера. Этот параметр предоставляет в основном ориентировочную информацию. При использовании в сочетании с
Content-Disposition: вложение
, оно используется в качестве имени файла по умолчанию для возможного диалогового окна «Сохранить как», представленного пользователю.-
имя файла*
Параметры
имя_файла
иимя_файла*
отличаются только тем, чтоимя_файла*
использует кодировку, определенную в RFC 5987. 0105 предпочтительнееимя файла
, когда понимаются оба.
Предупреждение: Строка, следующая за именем файла
, всегда должна быть заключена в кавычки; но по соображениям совместимости многие браузеры пытаются анализировать имена без кавычек, содержащие пробелы.
Ответ, вызывающий диалоговое окно «Сохранить как»:
200 OK Тип содержимого: текст/html; кодировка = utf-8 Content-Disposition: вложение; имя_файла="cool.html" Длина контента: 21 Спаси меня!
Этот простой HTML-файл будет сохранен как обычная загрузка, а не отображаться в браузере. Большинство браузеров предлагают сохранить его под именем файла cool.html
(по умолчанию).
Пример HTML-формы, опубликованной с использованием формата multipart/form-data
, в котором используется заголовок Content-Disposition
:
POST /test.html HTTP/1.1 Хост: example.org Content-Type: multipart/form-data;boundary="boundary" --граница Content-Disposition: данные формы; имя = "поле1" значение1 --граница Content-Disposition: данные формы; имя="поле2"; имя_файла="example.txt" значение2 --граница--
Спецификация |
---|
Использование поля заголовка Content-Disposition в протоколе передачи гипертекста (HTTP) # header. ![]() |
Возврат значений из форм: multipart/form-data # section-4.2 |
Таблицы BCD загружаются только в браузере с включенным JavaScript. Включите JavaScript для просмотра данных.
Примечания о совместимости
- Firefox 5 более эффективно обрабатывает заголовок HTTP-ответа
Content-Disposition
, если указаны оба параметраимя_файла
иимя_файла*
; он просматривает все предоставленные имена, используя параметримя файла*
, если он доступен, даже если параметримя файла
включен первым. Раньше использовался первый совпадающий параметр, что предотвращало использование более подходящего имени. См. ошибку Firefox 588781. - Firefox 82 (и более поздние версии) и Chrome отдают приоритет атрибуту
загрузки
HTML-элемента по сравнению с параметромContent-Disposition: inline
(для URL-адресов того же происхождения).