Spring boot 的ribbon转发post请求总是失败

zpc38368330 2019-04-24 11:50:51
前台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"}
...全文
249 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyangyangNO1 2019-04-24
  • 打赏
  • 举报
回复
ribbon是对请求做负载均衡的,用ribbon的restTemplate对url有特殊的规定,如果直接指定ip+端口会报错,你可以查一下怎么配置一个url
sk815 2019-04-24
  • 打赏
  • 举报
回复
你的js 提交方式表单 所以接口中 你不能用@RequestBody 接参数·····

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧