Spring boot 的ribbon转发post请求总是失败
前台html代码如下
$.ajax({
type: "POST", //提交的方法
//url:"/login", //提交的地址
url:'/UserOp/login',
//url:'commUserOpjson/jsonChkLogin',
data:$('#form_login').serialize(),// 序列化表单值
dataType:"json",
async: false,
error: function(request) { //失败的话
sMsg.innerHTML=request.responseText;
},
ribbon controller 代码如下
@RequestMapping(value="/**",method=RequestMethod.POST)
public String route_post(HttpServletRequest request,@RequestBody String body)
{
String param=request.getQueryString();
if(StringUtils.isBlank(param))
param="";
else
param="?"+param;
String url="http:/"+request.getRequestURI()+param;
return restTemplate.postForObject(url,new HttpEntity<String>(body), String.class);
}
@RequestMapping(value = "/**",method=RequestMethod.GET)
public String route_get(HttpServletRequest request) throws IOException {
try {
String url="http:/"+request.getRequestURI()+"?"+request.getQueryString();
return restTemplate.getForObject(url, String.class);
} catch (final HttpClientErrorException e) {
throw e;
//return new ResponseEntity<>(e.getResponseBodyAsByteArray(), e.getResponseHeaders(), e.getStatusCode());
}
}
spring boot 微服务代码
@RequestMapping(value="/login",method=RequestMethod.GET)
@ApiOperation(value="username,auth_group,tid", notes="根据u=account&p=password来获取用户详细信息")
public String login(HttpServletRequest request,@RequestParam String uname,@RequestParam String upass)
{
Cloud_Users user= cloud_UsersRepository.findByUsernameAndPassword(uname,upass);
if(user==null)
return MyJ_ReqResult.getJsonMsg(MyJ_ReqResult.DB_NOTFIND, "账户或密码错误.", null);
return MyJ_ReqResult.getJsonMsg(MyJ_ReqResult.OK, "", user);
}
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ApiOperation(value="session:username,auth_group,tid", notes="根据u=account&p=password来获取用户详细信息")
public String login_post(@RequestParam String uname,@RequestParam String upass)
{
Cloud_Users user= cloud_UsersRepository.findByUsernameAndPassword(uname,upass);
if(user==null)
return MyJ_ReqResult.getJsonMsg(MyJ_ReqResult.DB_NOTFIND, "账户或密码错误", null);
return MyJ_ReqResult.getJsonMsg(MyJ_ReqResult.OK, "", user);
}
我单独测试过微服务,所有测试都能测试通过,但是使用ribbon转发post却总是出现错误,怀疑是下面这段代码有问题,
@RequestMapping(value="/**",method=RequestMethod.POST)
public String route_post(HttpServletRequest request,@RequestBody String body)
{
String param=request.getQueryString();
if(StringUtils.isBlank(param))
param="";
else
param="?"+param;
String url="http:/"+request.getRequestURI()+param;
return restTemplate.postForObject(url,new HttpEntity<String>(body), String.class);
}
我将ajax的type 改成 "GET",代码可以通过,说明URL似乎是没有问题,但是改成post总是提示如下错误
{"timestamp":"2019-04-24T03:44:52.515+0000","status":500,"error":"Internal Server Error","message":"400 null","trace":"org.springframework.web.client.HttpClientErrorException$BadRequest: 400 null\r\n\tat org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79)\r\n\tat org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)\r\n\tat org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)\r\n\tat org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)\r\n\tat
.....
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.lang.Thread.run(Unknown Source)\r\n","path":"/UserOp/login"}