【发布时间】:2018-08-19 19:22:48
【问题描述】:
我正在尝试使用 AJAX POST 将我在第三方 JS 函数(支付网关的)回调函数中获得的响应保存到我的服务器,但我得到的状态代码为 - 405 Method Not Allowed。我得到的响应是 - 消息:不支持请求方法“POST”,描述:请求的资源不允许指定的 HTTP 方法。
我有以下 Javascript 客户端代码 -
gateway.pay(token, {
onSuccess : function(result) {
console.log(result);
saveTransactionResult(result);
},
onError : function(result) {
//
},
onClose : function() {
//
}
});
.....
saveTransactionResult : function(result) { // save result to server.
$.ajax({
headers : {
Accept : "text/plain",
"Content-Type" : "application/json"
},
url : "/myshop/checkout/payment/complete",
type : "POST",
data : JSON.stringify(result),
dataType : "text",
success : function(data) {
console.log(data);
console.log("Payment Details have been saved!");
},
error : function() {
console.log("an error has occurred while posting response!");
}
});
}
对应的Server-side Spring MVC Handler -
@ResponseBody
@RequestMapping(value = "/complete", method = RequestMethod.POST, consumes =
{ "application/json" })
public String saveResponse(@RequestBody final ResponseData responseData)
{
final boolean result = paymentService.savePayment(responseData);
if (result)
{
return "Success";
}
else
{
return "Failure";
}
}
StackOverflow 上“405 Method not allowed”的大多数答案都导致与跨域请求相关的问题,但我不确定我的请求是否是跨浏览器请求,因为它是由回调中编写的本地代码调用的第三方js。如果不是这种情况,这仅仅是我的请求标头或 Ajax 公式的问题吗? Ajax 请求是否必须有一个带有注释 @ResponseBody 的处理程序,即使它在功能上不希望返回任何特定于浏览器的内容?
我在 Chrome 上分析此 Ajax 请求时注意到的另一件事是 CSRFToken 以下列方式自动附加到请求有效负载 -
{"response":"from","payment":"gateway"}&CSRFToken=7c4c40-b4c4c-44cd3-94c4-a44c437
这是导致问题的原因吗?如果是这样,我是否需要在我的请求处理程序中对这个 CSRF Token 做任何特定的处理?
PS - 我已经添加了 ajax“标题”,因为我之前在没有它们的情况下获得了 415(不支持的媒体类型)状态代码,正如这篇文章中所建议的 - POST JSON fails with 415 Unsupported media type, Spring 3 mvc 但现在我有一个 405!
【问题讨论】:
-
您发布到 url“/myshop/checkout/payment/complete”,但控制器映射值为“/complete”。可能,问题来了?
-
不,这不是问题。 “/complete”是我的处理程序方法的映射。 url 的其余部分由我的控制器顶部的 RequestMapping 处理。
标签: javascript java jquery ajax spring-mvc