HttpMediaTypeNotAcceptableException/HttpMediaTypeNotAcceptableException:找不到可接受的表示 [英] HttpMediaTypeNotAcceptableException / HttpMediaTypeNotAcceptableException: Could not find acceptable representation
问题描述
我有一个客户端试图连接的 API.但是它会抛出错误:
I have a API that a client is trying to connect to. However it throws the error:
2015 09 22 04:21:44.297 [org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor] Could not parse Accept header: Invalid token character ',' in token "json,application/x-www-form-urlencoded"
2015 09 22 04:21:44.298 [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver] Resolving exception from handler [public org.springframework.http.ResponseEntity<java.lang.String> com.areviews.api.restcontroller.APIOrderController.getNewOrderApi(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
2015 09 22 04:21:44.298 [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver] Invoking @ExceptionHandler method: public org.springframework.web.servlet.ModelAndView com.areviews.web.controller.AbstractController.handleException(java.lang.Exception,javax.servlet.http.HttpServletRequest)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:115)
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:129)
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:74)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
控制器:
@RequestMapping(value = {"order/add"}, method = RequestMethod.POST, produces="application/json; charset=utf-8")
@ResponseBody
public ResponseEntity<String> getNewOrderApi(HttpServletRequest request,
HttpServletResponse response) throws Exception {
.....
return JsonUtils.createJson(jsonObj);
}
他们使用 jQuery 来请求我的 API:
They use jQuery to request my API:
$.ajax({
url: "https://api.mywebsite.com/apiv1/order/add",
type: 'POST',
beforeSend: function(xhr) {
xhr.setRequestHeader("Content-Type","application/json;charset=utf-8");
},
data : JSON.stringify(data),
dataType: 'json',
success: function(data) {
if (data.success == true){
console.log(data);
}else{
console.log("error: " + data.error_description);
}
}
});
问题在于他们的请求标头中的内容类型"是:
The problem is in their Request Header the "Content-Type" is:
Accept:application/json, text/javascript, */*
Accept-Encoding:gzip, deflate
Accept-Language:zh,zh-TW;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:561
Content-Type:application/x-www-form-urlencoded, application/json;charset=UTF-8
我们不知道application/x-www-form-urlencoded"来自哪里(,"产生了问题,因为它应该是一个;").我能做什么?他们能做些什么?
We don't know where the "application/x-www-form-urlencoded," comes from (the "," creates the problem because it should be a ";"). What can I do on my side? What can be done on their side?
推荐答案
我也遇到了同样的问题.
I have also faced the same issue.
我尝试使用 Volley 从 android 访问 API.
I have tried to hit the API from android using Volley.
有 2 种不同的 Content-Type.一个是请求头Content-Type
,另一个是Body Content-Type
.当您从 volley 发起 POST
或 PUT
请求时,volley 获取请求标头并检查正文 Content-Type.如果没有提到 body Content-Type,volley 会自行添加.Volley 结合了 Content-Type,我们的服务器只能接受一种 Content-Type.但是,由于 volley 结合了标题和正文的 Content-Type,它变成了application/json, application/x-www-form-urlencoded; charset=utf-8".
There are 2 different Content-Type. One is Request header Content-Type
and other is Body Content-Type
. When you initiate a POST
or PUT
request from the volley, volley take request header and check for body Content-Type. If body Content-Type is not mentioned, volley will add by itself. Volley combines both the Content-Type and our server was able to accept only one Content-Type. But, as volley combines Content-Type for header and body it become "application/json, application/x-www-form-urlencoded; charset=utf-8".
这里,application/x-www-form-urlencoded
"是请求正文的内容类型.所以,为了解决这个问题,你可以重写 getBodyContentType()
方法并返回 null.
Here, "application/x-www-form-urlencoded
" is Content-Type for request body. So, to solve this problem, you can override getBodyContentType()
method and return null.
@Override
public String getBodyContentType() {
//return super.getBodyContentType();
return null;
}
不要使用return ""
.使用 return ""
也会抛出异常.
Do not use return ""
. Using return ""
will also throw exception.
[org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor] Could not parse Accept header: Invalid token character ',' in token "json, "
希望这会有所帮助.
这篇关于HttpMediaTypeNotAcceptableException/HttpMediaTypeNotAcceptableException:找不到可接受的表示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!