2016-07-11 4 views
3

Я пытаюсь понять, как эта система работает под капотом. Система - это REST, которая довольно стандартная, то, что я не получаю от клиента, вызывает вызов OPTIONS перед каждым вызовом API, а содержимое xml возвращается в формате. Это используется Джерси-Ява.Параметры вызова meta перед вызовом API REST

OPTIONS ответ для DELETE метода

Access-Control-Request-Method: DELETE передается в заголовках

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<application xmlns="http://wadl.dev.java.net/2009/02"> 
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.8 2014-04-29 01:25:26"/> 
    <grammars/> 
    <resources base=“http://domain.com”> 
     <resource path=“data/gasdfasdg/entity”> 
      <method id="deleteEntity" name="DELETE"> 
       <request> 
        <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:string"/> 
       </request> 
       <response> 
        <representation mediaType="application/json"/> 
       </response> 
      </method> 
      <method id="getOneEntitysMetadata" name="GET"> 
       <request> 
        <param xmlns:xs="http://www.w3.org/2001/XMLSchema" name="q" style="query" type="xs:string"/> 
        <param xmlns:xs="http://www.w3.org/2001/XMLSchema" name="x-dps-compute-content-size" style="header" type="xs:boolean"/> 
        <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:string"/> 
       </request> 
       <response> 
        <representation mediaType="application/json"/> 
       </response> 
      </method> 
      <method id="createOrUpdateEntity" name="PUT"> 
       <request> 
        <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:string"/> 
       </request> 
       <response> 
        <representation mediaType="application/json"/> 
       </response> 
      </method> 
     </resource> 
    </resources> 
</application> 

Вопрос:

А. Является ли это стандарт или отраслевая практика для клиента, чтобы позвонить OPTIONS первых , обрабатывать и анализировать ответ и определять API, параметры и т. д., прежде чем совершать фактический вызов? Раньше я просто смотрел документы и программировал мои вызовы REST в клиенте (javascript) соответственно.

B. Этот вызов сделан браузером автоматически (предполетным) или был запрограммирован в клиенте?

ответ

5

Чтобы понять, что происходит, вам нужно знать о CORS (cross origin resource sharing). Запрос OPTIONS - это предполетный запрос (сделанный браузером в ответ на попытку клиента выполнить запрос ajax для перекрестного происхождения), который является первоначальным запросом на сервер, чтобы проверить, разрешено ли этому клиенту запрос на сервер. Предполетный запрос отправляет определенные заголовки, которые сервер понимает, и сервер ответит назад с разными заголовками. Например, клиент может отправить

Origin: http://foo.example 
Access-Control-Request-Method: DELETE 

С этими двумя заголовками запроса, есть два соответствующих заголовков ответа, что браузер ожидает. Заголовки запроса в основном просят «разрешено это происхождение» и «разрешен этот метод». Серверы должны отвечать

Access-Control-Allow-Origin: http://foo.example 
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE 

Выше приведены заголовки ответа, сказав, что происхождение допускается, и что эти методы разрешены. Если вы не видите эти заголовки, это означает, что у вас нет CORS, настроенных на вашем сервере. Если браузер не видит эти заголовки ответа, он не будет выполнять фактический запрос. Для настройки CORS обычно используется простой фильтр. В некоторых контейнерах, таких как Tomcat и Jetty, есть простая реализация фильтра, которую вы можете настроить, или вы можете просто взломать свой собственный, for example.

Обратите внимание, что приведенный выше сценарий обычно используется только для браузеров и XmlHTTPRequest запросов, указанных в приведенной выше ссылке.

Что такое XML, является то, что WADL. Единственная причина, по которой вы это понимаете, заключается в том, что у Джерси есть собственная функция WADL, включенная по умолчанию. WADL не является обязательным, но у Джерси есть, и он настроен на ответ на запросы OPTIONS. Если вы отключили WADL (что возможно), вместо получения XML вы просто получите ответ 405 Not Allowed, то есть метод OPTIONS не разрешен для этой конечной точки. WADL - это не стандарт, относящийся к протоколу CORS. Это всего лишь побочный эффект функции WADL Джерси. WADL и CORS не имеют ничего общего друг с другом.

+0

Спасибо, WADL кажется стандартом, я должен предоставить WADL, если я разрабатываю сервисы REST для моих клиентов? – user2727195

+0

Вы не _have_ к. Это не больно иметь его, хотя. –

+0

ОК, страница говорит, что «у консорциума нет текущих планов стандартизации», для меня методы REST и путь URI достаточно, чтобы рассказать, что предназначено, и что происходит в 'body', возможно, задано с помощью схем – user2727195

Смежные вопросы