2016-07-11 27 views
3

Ich versuche zu verstehen, wie dieses System unter der Haube arbeitet. Das System ist REST basiert das ist ziemlich Standard, was ich nicht bekomme der Client macht einen OPTIONS Aufruf vor jedem API-Aufruf und XML-Inhalt wird im Format zurückgegeben. Es benutzt Jersey Java.Optionen Aufruf für Meta vor REST-API-Aufruf

OPTIONS Antwort für die DELETE Methode

Access-Control-Request-Method: DELETE in den

Header übergeben
<?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> 

Frage:

A. Ist es eine Standard- oder Branchenpraxis für den Kunden zu nennen OPTIONS zuerst , verarbeiten und analysieren Sie die Antwort und bestimmen Sie die API, Parameter usw., bevor Sie tatsächlich anrufen? Zuvor habe ich mir nur die Dokumente angeschaut und meine REST-Aufrufe im Client (Javascript) entsprechend programmiert.

B. Wird dieser Anruf vom Browser automatisch ausgeführt (Preflight) oder wurde er im Client programmiert?

Antwort

5

Um zu verstehen, was los ist, müssen Sie über CORS (cross origin resource sharing) verstehen. Die OPTIONS-Anfrage ist die Anfrage vor dem Flug (vom Browser als Reaktion darauf, dass der Client versucht, eine Cross-Ajax-Anfrage zu stellen), die eine anfängliche Anfrage an den Server ist, um zu überprüfen, ob dieser Client erlaubt ist eine Anfrage an den Server. Die Pre-Flight-Anforderung sendet bestimmte Header, die der Server versteht, und der Server antwortet mit verschiedenen Headern. Beispielsweise könnte der Client senden:

Mit diesen zwei Anforderung-Header gibt es zwei entsprechende Antwortheader, die der Browser erwartet. Die Anfrage-Header fragen grundsätzlich "ist dieser Ursprung erlaubt" und "ist diese Methode erlaubt". Die Server sollten reagieren mit

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

Die die Antwort-Header oben sind, sagen, dass der Ursprung erlaubt ist, und dass diese Methoden sind nicht zulässig. Wenn Sie diese Header nicht sehen, bedeutet dies, dass Sie CORS auf Ihrem Server nicht konfiguriert haben. Wenn der Browser diese Antwortheader nicht anzeigt, wird die eigentliche Anfrage nicht durchgeführt. Zum Konfigurieren von CORS wird im Allgemeinen ein einfacher Filter verwendet. Einige Container, wie Tomcat und Jetty, verfügen über eine einfache Filterimplementierung, die Sie konfigurieren können, oder Sie können einfach Ihre eigene erstellen, for example.

Beachten Sie das obige Szenario ist in der Regel nur für Browser und XmlHTTPRequest Anfragen, wie im obigen Link erwähnt.

Was das XML ist, ist das WADL. Der einzige Grund, warum Sie dies erhalten, ist, dass Jersey seine eigene WADL-Funktion standardmäßig aktiviert hat. WADL ist nicht obligatorisch, aber Jersey hat es und ist so konfiguriert, dass es auf OPTIONS-Anfragen reagiert. Wenn Sie die WADL (was möglich ist) deaktiviert haben, erhalten Sie statt der XML-Anweisung nur eine 405-Not-Allowed-Response, was bedeutet, dass die OPTIONS-Methode für diesen Endpunkt nicht erlaubt ist. Die WADL ist nichts, was dem CORS-Protokoll entspricht. Es ist nur ein Nebeneffekt von Jerseys WADL-Funktion. WADL und CORS haben nichts miteinander zu tun.

+0

Danke, ist WADL scheint wie ein Standard, soll ich WADL zur Verfügung stellen, wenn ich REST-konforme Dienste für meine Kunden entwickle? – user2727195

+0

Sie haben _have_ nicht. Es tut nicht weh, es zu haben. –

+0

ok, die Seite sagt '" Konsortium hat keine aktuellen Pläne, es zu standardisieren "', für mich sind REST-Methoden und URI-Pfad genug, um zu sagen, was beabsichtigt ist, und was in der 'body' geht möglicherweise durch Schemata – user2727195