【问题标题】:Why isn't PUT method sent using XMLHttpRequest received by the server?为什么服务器没有收到使用 XMLHttpRequest 发送的 PUT 方法?
【发布时间】:2013-11-30 01:38:16
【问题描述】:

我正在使用 Jersey 和 tomcat 编写我的第一个 Web 服务。我想使用 PUT 方法从使用 javascript 的网页上传文件。我注意到的是我的服务器没有收到 PUT 请求,而它似乎正在收到 GET 和 POST。这是我在服务器端的方法:

@PUT
@Path("myPut")
@Produces(MediaType.TEXT_PLAIN)
public String myPut() {
   System.out.print("OK!");
   return "OK!";
}

这是我在客户端写的代码:

function myFunction() {
   var client = new XMLHttpRequest();
   client.open("PUT", "http://localhost:8080/.../myPut", false);
   client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
   client.send("test");
}

如果我只是用 GET 或 POST(在客户端和服务器上)替换该方法,我会得到“OK!”响应字符串(并打印)。我也尝试了 curl 并且服务器似乎按照我的预期回答:

curl -X PUT -v http://localhost:8080/.../myPut
* Adding handle: conn: 0xc2eee0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xc2eee0) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> PUT /.../myPut HTTP/1.1
> User-Agent: curl/7.32.0
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Content-Type: text/plain
< Content-Length: 3
< Date: Sat, 16 Nov 2013 17:45:36 GMT
< 
* Connection #0 to host localhost left intact
OK!

我读了一点,似乎 PUT 应该适用于 Firefox 和 Chrome,这意味着我做错了什么(例如,here,PUT 明确在列表中;也来自第一个答案 @987654322 @我猜 PUT 应该可用)。有谁能指正吗?

如果这种方式完全错误/不可接受,您能否建议另一种技术来执行此操作(上传本地文件,可能允许我显示进度条)?

【问题讨论】:

  • AFAIK,浏览器通常不支持所有 REST 方法。 DELETE 是另一个可能不受支持的示例。你有没有看到一些其他说明的文档?
  • 但是...developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest 似乎建议它应该在 open(...) 方法的定义中起作用。
  • @BlueSkies 所有浏览器在发送 xhr 请求时都支持所有方法。
  • 我的网页是在浏览器中打开的本地html文件。它不是由服务器提供的。这可能与同源政策有关吗?

标签: javascript rest xmlhttprequest jersey


【解决方案1】:

问题是由同源策略引起的。从 Web 服务本身返回页面解决了这个问题。否则 CORS 将是一个可能的解决方案。

【讨论】:

    【解决方案2】:

    Tomcat 默认不支持PUT 方法。您需要对其进行配置。看这里 http://www.codereye.com/2010/12/configure-tomcat-to-accept-http-put.html?m=1

    您可以使用名为“Advanced Rest client”的 chrome 扩展来测试所有动词

    【讨论】:

    • 为什么使用 curl 发送的 PUT 方法到达服务器,而使用我的代码发送的 PUT 方法没有?
    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2012-06-13
    • 2018-03-27
    • 2020-04-13
    • 2015-11-12
    相关资源
    最近更新 更多