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
--граница--
 

901 46

Спецификация
Использование поля заголовка Content-Disposition в протоколе передачи гипертекста (HTTP)
# header. field.definition
Возврат значений из форм: multipart/form-data
# section-4.2

Таблицы BCD загружаются только в браузере с включенным JavaScript. Включите JavaScript для просмотра данных.

Примечания о совместимости