在 REST API 调用之前对 meta 进行 OPTIONS 调用

我试图理解这个系统是如何在引擎盖下工作的。该系统是基于非常标准的,我没有得到的客户端在每次API调用之前进行调用,并且XML内容以该格式返回。它使用泽西爪哇。RESTOPTIONS

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://example.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>

问题

一个。在进行实际调用之前,客户首先调用,处理和分析响应并确定API,参数等是标准还是行业惯例?早些时候,我只是在查看文档,并在客户端(JavaScript)中相应地编程我的REST调用。OPTIONS

B.此调用是由浏览器自动进行的(预检)还是在客户端中编程的?


答案 1

要了解发生了什么,您需要了解CORS(跨域资源共享)。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,有一个简单的过滤器实现,你可以配置,或者你可以鞭打自己的,例如

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

XML是什么,就是WADL。您获得此消息的唯一原因是,泽西岛默认启用了自己的WADL功能。WADL不是强制性的,但泽西岛有它,它被配置为响应OPTIONS请求。如果禁用了 WADL(这是可能的),则只会获得 405 不允许的响应,而不是获取 XML,这意味着该终结点不允许使用 OPTIONS 方法。WADL不是关于CORS协议的标准。这只是泽西岛WADL功能的副作用。WADL和CORS彼此之间没有任何关系。


答案 2