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"}
$.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"}
...全文
相关推荐
SpringCloud zuul jar包
**监控**:Zuul可以与Spring Boot Actuator配合,收集并展示关于请求处理的性能指标,便于监控和优化。在进行SpringCloud zuul的使用时,通常需要以下步骤:1.
全面解读Spring Cloud Zuul:从配置到优化的实战指南
在微服务架构中,API网关作为核心组件之一,承担着请求路由、负载均衡、安全认证等重要功能。Spring Cloud Zuul作为一款功能强大的API网关解决方案,得到了广泛应用。本文将深入探讨Spring Cloud Zuul的各项功能,从基础配置到工作原理,再到多层负载和应用优化,全面解析其在实际应用中的最佳实践与实用技巧,为开发者提供一站式指导,助力其打造高性能、高可用的微服务架构。
Spring面试题及详细答案 125道(111-125) -- Spring Cloud
特别针对Spring Cloud微服务架构进行了深入解析,包括其核心组件(Eureka、Ribbon、Feign等)的作用及实现原理。文章详细讲解了服务注册与发现机制、负载均衡实现方式、Eureka的自我保护机制等关键知识点,并配有代码示例和配置说明,帮助开发者快速掌握微服务架构的核心技术要点。(149字)
Spring高频面试基础问题与知识点整理
高频Spring相关基本面试题和知识点整理
Zuul服务
**监控与日志**:Zuul支持与Spring Boot Actuator整合,方便对服务的运行状态进行监控,同时也可以收集请求日志,便于分析和优化服务性能。


Web 开发
