【问题标题】:I get error when send PUT request with AJAX使用 AJAX 发送 PUT 请求时出现错误
【发布时间】:2017-09-25 14:01:44
【问题描述】:

我编写了 HTML 和 AJAX 代码来更新我网络中的相机密码。 当我提交表单时,我只得到 ​​p>

“错误”(net::ERR_EMPTY_RESPONSE)

在 Chrome 中,它不会更新密码。但是当我使用 POSTMAN 尝试 PUT 请求时,我得到了OK(200) 并且它更新成功。此外,它在使用 Internet Explorer 的区域设置(即从桌面运行 HTML 文件)中也能很好地工作。但上传到服务器后,它也不能与 Internet Explorer 一起使用(等待和拒绝访问)。

function myFunction() {
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": "http://192.168.1.64/Security/users?auth=YWRtaW46MTEK",
        "method": "PUT",
        "headers": {
            "cache-control": "no-cache",
            "postman-token": "fda97359-6164-70d0-2896-8ca4804ac06c"
        },
        "data": "<UserList xmlns=\"http://www.hikvision.com/ver10/XMLSchema\" version=\"1.0\"><User xmlns=\"http://www.hikvision.com/ver10/XMLSchema\" version=\"1.0\"><id>1</id><userName>admin</userName><password>TT.123456</password></User></UserList>"
    }

    $.ajax(settings).done(function (response) {
        console.log(response);
    });
}

我在 chrome 中收到此错误。请看屏幕截图:

“邮递员”截图:

【问题讨论】:

  • 错误是什么?客户端和/或服务器端?
  • Chrome 扩展程序 == 邮递员?如果是这种情况,那么很可能是端点上的配置/逻辑问题。这也有助于显示错误消息。
  • 顺便说一句,天哪,请采取措施避免发送无效的 XML 等。
  • @Dave Newton,@Tez Wingfield 客户端错误。在铬:ibb.co/nvjn15ibb.co/cU9buQ。在 Firefox 中:ibb.co/ch5S15ibb.co/nf55ok。但是当发送具有高级 REST 客户端状态的请求时:ibb.co/kN2kok
  • 请用附加信息编辑问题——不要作为站外链接。

标签: jquery ajax xml cors put


【解决方案1】:

为了进行跨域请求(在客户端),它很可能需要是 POST 请求而不是 PUT。根据HTTP access control (CORS)的MDN文档:

简单的请求

有些请求不会触发CORS preflight。在本文中,这些被称为“简单请求”,尽管 Fetch 规范(定义 CORS)没有使用该术语。不触发CORS preflight 的请求——所谓的“简单请求”——是满足以下所有条件的请求:

1

我在本地运行了您帖子中的代码,将方法更改为POST。端点需要添加以下标头:

access-control-allow-headers: cache-control,postman-token
access-control-allow-origin: *

虽然Access-Control-Allow-Origin 可以设置为特定域而不是*。例如:

Access-Control-Allow-Origin: https://intranetHost

在下图中,第一个 XHR 请求是飞行前请求(其中方法是OPTIONS),第二个是实际请求(其中方法是POST

或者,如果它仍然需要是 PUT 请求,也许可以向将发出 PUT 请求的服务器端端点发出请求(例如使用 cURL)。


1https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests

【讨论】:

  • 谢谢。我用 POST 方法测试,但我得到了同样的错误。在 Internet Explorer 中:"SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied." 和在 chrome 中:net::ERR_EMPTY_RESPONSE
  • 您是否可以控制被调用端点发送的标头(即 192.168.1.64/Security/users?)?您需要确保它允许额外的请求标头
  • 不幸的是,我无法控制目标设备。但是使用我在问题中编写的代码,我成功地在语言环境和 Internet Explorer 上更改了密码。当我将代码传输到 Internet 时,它不起作用。我认为海康威视摄像头只提供本地访问权限。
  • 是的,就像我在回答末尾提到的那样,您可能需要执行服务器端请求 - 这基本上等同于 Postman 中的请求;对于提供 HTML 的站点,您有任何服务器端脚本功能吗?例如PHP、NodeJS、ASP 等...其中许多支持 cURL 或类似技术
  • 是的,正如我提到的:您可能需要执行服务器端请求 - 这基本上等同于 Postman 中的请求;对于提供 HTML 的站点,您有任何服务器端脚本功能吗?例如PHP、NodeJS 等...其实,看着the API docs(假设是这样)没有提到标题cache-controlpostman-令牌 - 如果你不传递这些标题有帮助吗?
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多