Я следовал официальному техническому руководству для сервисов загрузки 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) … я ошибаюсь?
Я открыл вопрос с разработчиками валидатора, и они подтвердили, что он работает не так, как ожидалось. Валидатор должен добавить в запрос заголовок «Accept», но он оставит его пустым. Они работают в исправлении.
Других решений пока нет …