为什么服务器没有使用 XMLHttpRequest 发送 PUT 方法

Why isn't PUT method sent using XMLHttpRequest received by the server?

本文关键字:XMLHttpRequest 发送 PUT 方法 服务器 为什么      更新时间:2023-09-26

我正在使用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,这意味着这是我做错了什么(例如,这里,PUT明确在列表中;而且从这里的第一个答案中我猜PUT应该可用)。有人能够纠正吗?

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

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

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

您可以使用名为"高级 Rest 客户端"的 chrome 扩展程序测试所有动词