OpenSearch + PHP для INSPIRE ATOM: почему я могу получить правильный Content-Type?
Я следовал официальному техническому руководству по службам загрузки INSPIRE для создания канала ATOM с помощью OpenSearch: https://inspire.ec.europa.eu/documents/technical-guidance-implementation-inspire-download-services
Я застрял в создании PHP
который выполняет поиск.
Согласно вышеупомянутому руководству, XML-описание OpenSearch должно иметь следующие шаблоны:
<Url type="application/zip" rel="results" template="http://myWeb/atom/search.php?spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"/>
<Url type="application/atom+xml" rel="describedby" template="http://myWeb/atom/search.php?spatial_dataset_identifier_code={inspire_dls:spatial_dataset_identifier_code?}&spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&crs={inspire_dls:crs?}&language={language?}&q={searchTerms?}"/>
Это же руководство имеет PHP
скрипт, помогающий разработчику написать файл "search.php". Этот скрипт начинается так:
$returnFile = false;
foreach (apache_request_headers() as $name => $value) {
//echo("$name: $value\n");
if ($name=="Accept" && $value=="application/zip"){
$returnFile = true;
}
}
Если $returnFile
Это правда, ZIP-файл должен быть возвращен. Если оно ложно, возвращается XML (это то, что делает остальная часть сценария).
Моя проблема в том, что состояние $name=="Accept" && $value=="application/zip"
никогда не соответствует действительности, поэтому поиск всегда возвращает XML.
Как может $value
быть application/zip
?
Это Accept
значение, которое я получаю при доступе http://myWeb/atom/search.php
:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
РЕДАКТИРОВАТЬ: Руководство рассказывает что-то еще об этом:
The example given in Annex A uses content negotiation to identify which
operation to perform. This means that even though the operation endpoint is
only one, i.e. http://myWeb/search.php, the client has to set the HTTP
―Accept‖ Header to the correct value in order to receive the expected
result.
Итак, если я тестирую свой фид ATOM в валидаторе INSPIRE, клиент будет валидатором INSPIRE (тот, который отправляет запросы в search.php)... я ошибаюсь?
1 ответ
Я открыл вопрос с разработчиками валидатора, и они подтвердили, что он работает не так, как ожидалось. Валидатор должен добавить заголовок "Accept" в запросе, но он оставит его пустым. Они работают в исправлении.