Java - RestTemplate出现405 Method Not Allowed错误,但Postman可以正常调用。

4

我在使用RestTemplate时遇到了一个奇怪的问题。我正在使用某个REST API,我想用PUT方法更新其中的一些内容。 因此,在例如Postman中,我发送了以下请求:

PUT http://fake/foobar/c/123 with a certain body

使用Postman更新成功。如果我现在通过RestTemplate在Java中执行相同的调用,我将得到一个405方法不允许的错误:

HttpHeaders headers = createHeader();
HttpEntity<Offer> httpEntity = new HttpEntity<>(bodyEntity, headers);
String url = "http://fake/foobar/c/123"; //Created dynamically, but here pasted for sake of simplicity
RestTemplate restTemplate = new RestTemplate(...);
ResponseEntity<OfferResponse> response = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, OfferResponse.class);
...

我一再比较了URL。如果我将控制台中记录的URL复制并粘贴到Postman中,我就能成功更新。我还比较了头文件和其他所有内容。与通过Postman进行操作时一样,所有东西都是相等的。
是否还有可能存在其他原因导致这种行为呢(除了我太愚蠢,无法比较头文件等内容并错过了什么)?针对此API的其他PUT、POST调用等功能正常,否则我会认为我的RestTemplate使用有普遍问题。

在新的RestTemplate(...)调用之前添加一个logging/System.out,并输出生成的URL。您确定动态生成的URL与您在Postman中测试的URL完全相同吗? - AlexC
是的,这就是我所做的。我从那里复制了URL到Postman中,并且使用完全相同的URL在Postman中工作。 - MDDCoder25
你能展示一下你的API代码吗? - Dinesh Shekhawat
@MDDCoder25,你找到这个问题的解决方案了吗?我也遇到了同样的问题。 - MuCh
3个回答

2

代码405方法不允许表示您使用的HTTP动词(GET、POST、PUT等)已知但未被API接受。

如果您不能像@Dinesh Singh Shekhawat建议的那样发布API的详细信息,我将首先尝试使用Postman Code功能,并获取请求的Java(OkHTTP或UniRest)自动生成的代码。您可以在“发送”按钮下面的右侧找到此选项。复制此代码并尝试执行请求。

enter image description here

然后将此请求与您的请求进行比较。

如果没有要求,您始终可以使用HttpPut代替RestTemplate:

HttpClient client = HttpClientBuilder.create().build();
String url = "http://fake/foobar/c/123";

HttpHeaders headers = createHeader();
HttpEntity<Offer> httpEntity = new HttpEntity<>(bodyEntity, headers);
HttpPut httpPut = new HttpPut(url);
httpPut.setEntity(httpEntity);

HttpResponse response = client.execute(httpPut);


0

我曾经遇到过同样的问题。后来我在日志中打印了请求和URL。 我发现我使用了错误的端点。 请尝试在日志中打印URL和请求,并检查它们是否符合预期且正确无误。


0

如果有人遇到同样的问题,这可能会有所帮助:对我来说,问题只是URL末尾斜杠/的问题。在Insomnia(类似于Postman)中,我有一个斜杠,在代码中没有。当我将斜杠添加到我的代码中时,一切正常。

失败:http://localhost:8080/api/files
成功:http://localhost:8080/api/files/

当然,也可能是另一种情况,因此请仔细检查实际的API定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接