选项在REST API调用之前调用meta

use*_*195 6 javascript java rest options jersey

我试图了解这个系统是如何工作的.该系统是REST基于非常标准的,我没有得到客户端OPTIONS在每次API调用之前进行调用,并以格式返回xml内容.它正在使用Jersey Java.

OPTIONSDELETE方法的响应

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>
Run Code Online (Sandbox Code Playgroud)

问题:

A. OPTIONS在进行实际呼叫之前,客户首先呼叫,处理和分析响应并确定API,参数等是标准还是行业惯例?之前我一直只是在客户端(javascript)中查看文档和编程我的REST调用.

B.此浏览器是自动(预检)还是在客户端编程?

Pau*_*tha 14

要了解正在发生的事情,您需要了解CORS(跨源资源共享).OPTIONS请求是飞行前请求(由浏览器做出,以响应客户端尝试发出交叉原始的ajax请求),这是对服务器的初始请求,以检查是否允许该客户端发出请求到服务器.飞行前请求发送服务器理解的特定标头,服务器将使用不同的标头响应.例如,客户端可能会发送

Origin: http://foo.example
Access-Control-Request-Method: DELETE
Run Code Online (Sandbox Code Playgroud)

使用这两个请求标头,浏览器需要两个相应的响应标头.请求标头基本上是在询问"是否允许此来源"和"允许此方法".服务器应该响应

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Run Code Online (Sandbox Code Playgroud)

以上是响应头,表示允许原点,并允许这些方法.如果您没有看到这些标头,则表示您没有在服务器上配置CORS.如果浏览器没有看到这些响应标头,则它不会发出实际请求.要配置CORS,通常使用简单的过滤器.有些容器,比如Tomcat和Jetty,有一个简单的过滤器实现,你可以配置,或者你可以自己动手,例如.

请注意,上述方案通常仅适用于浏览器和XmlHTTPRequest请求,如上面的链接所述.

XML是什么,就是WADL.你得到这个的唯一原因是因为泽西岛默认启用了自己的WADL功能.WADL不是强制性的,但Jersey有它,并且它被配置为响应OPTIONS请求.如果您禁用了WADL(这是可能的),而不是获取XML,您将获得405 Not Allowed响应,这意味着该端点不允许使用OPTIONS方法.WADL与CORS协议无关.这只是Jersey的WADL功能的副作用.WADL和CORS彼此无关.