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?}&amp;spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&amp;crs={inspire_dls:crs?}&amp;language={language?}&amp;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?}&amp;spatial_dataset_identifier_namespace={inspire_dls:spatial_dataset_identifier_namespace?}&amp;crs={inspire_dls:crs?}&amp;language={language?}&amp;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" в запросе, но он оставит его пустым. Они работают в исправлении.

Другие вопросы по тегам