javascript - 不允许使用 ajax DELETE 方法

标签 javascript ajax

我正在尝试使用 scim 服务删除用户。

当我通过 SoapUI 调用它并 curl 它时它工作但是当我创建 ajax 调用时它返回 405 方法不允许

SOAPUI5

IP: https://localhost:9447//wso2/scim/Users/token_of_user_to_be_deleted

OAUTH2 token : my_token_for_oauth

媒体类型:application/json

curl

curl -v -k --user admin:admin -X DELETE https://localhost:9447/wso2/scim/Users/b228b59d-db19-4064-b637-d33c31209fae -H "接受:应用程序/json"

这既有效又删除了用户。

AJAX 不适合我

$.ajax({
    url: 'https://localhost:9447/wso2/scim/Users/token_of_user_to_be_deleted',
    type: 'DELETE',
    headers: { 'Content-Type':'application/json'},
    xhrFields: {
        withCredentials: true
    },

    beforeSend: function (request) {
            request.setRequestHeader('Authorization', 'Bearer ' + that.oauth2.loadToken().access_token);
    },


    success: function() {
        console.log("success")                        
    },
    error: function () {
        console.log("error")
    }
});

错误: 跨源资源共享 (CORS) 过滤器:不支持的 HTTP 方法:DELETE

最佳答案

浏览器在发送实际请求之前确实命中了一个OPTIONS 请求。此请求包括接受的方法

Access-Control-Allow-Methods: GET, OPTIONS

您的服务器不会在选项响应中发送 DELETE 接受方法,因此您的请求会抛出此错误。

要解决此问题,您需要将DELETE 添加到服务器接受的方法中。在您的服务器设置中

Access-Control-Allow-Methods: POST, GET, DELETE, OPTIONS

选项请求仅在浏览器上发送,因为它仅由浏览器作为安全措施实现。 curl/node/SOAPUI5 不确认此限制,因此可以让你得到你想要的。 (除非服务器在内部配置为阻止某些 header )

更新

正如@jannis 所提到的,值得注意的是,实际请求之前的OPTIONS 请求称为预检请求,该机制通常称为CORS.

您可以通过以下链接阅读更多预检请求(以及一般的 CORS):

关于javascript - 不允许使用 ajax DELETE 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45819091/

相关文章:

php - Ajax成功后渲染html的特定部分

javascript - 使用jquery获取元素id

javascript - Node.js/Sequelize.js/Express.js - 如何插入多对多关联? (同步/异步?)

Javascript动态文本框改变焦点

javascript - 如何从ajax获取发送响应到脚本

javascript - Node js ajax post请求

javascript - 禁止访问该服务器

javascript - 如何自定义react-calendar以一次只显示一周?

php - 添加动态文本框后表单提交

javascript - PHP 循环 JSON ajax 成功