Spring MVC RestFul 服务 + Jersey 客户端 400 错误请求
Spring MVC RestFul service + Jersey Client 400 Bad Request
我在 Spring 中创建了一个 RESTful 网络服务,并试图通过 Jersey 客户端调用它。这是我的控制器方法
@RequestMapping(value = "/create",
method = RequestMethod.POST,consumes={MediaType.APPLICATION_JSON_VALUE},
produces={MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<User> createUser(@RequestBody User user ){
User u = null;
HttpStatus statusCode;
try{
userService.create(user);
u = userService.getUserById(user.getId());
statusCode = HttpStatus.CREATED;
}catch(Exception e){
logger.error("Could not create user ", e);
u = null;
statusCode = HttpStatus.CONFLICT;
}
return new ResponseEntity<User>(u, statusCode);
}
当我从 Jersey 客户端调用此 Web 服务时,出现 400 Bad Request 错误。这是调用此服务的客户端
HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("xxxx", "yyyy");
final Client client = ClientBuilder.newClient();
client.register(feature);
WebTarget webTarget = client.target("http://localhost:8080/MyWeb/api").path("user/create");
Form form = new Form();
form.param("id", "jersey");
form.param("firstName", "Jersey");
form.param("lastName", "Client");
/*User user = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), User.class);*/
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
Response response = invocationBuilder.post(Entity.entity(form, MediaType.APPLICATION_JSON_TYPE));
System.out.println(response.getStatus());
System.out.println(response.getStatusInfo());
我尝试在服务和客户端中使用 MediaType
值,但没有任何效果。
我必须告诉你,我对此完全陌生,这就像我第一次接触 RESTful 网络服务。
请帮助我了解我在做什么错误..
我想你是在告诉服务你在有效负载中发送JSON,但你发送的是表单参数,当你这样做时:
form.param("id", "jersey");
以及以下几行,您正在模拟 POST,就像创建带有提交按钮的 HTML 表单一样。
您可能必须在您的客户端中声明一个 class 用户,实例化此 class 的一个对象并将属性填充为:
User user = new User();
user.setId("jersey");
然后在 POST 中发送这个对象(我没有使用 Invocation.Builder
但它确实有一些 post 方法以对象作为参数),Jersey 客户端应该处理在有效负载中发送 JSON 字符串的序列化。
我在 Spring 中创建了一个 RESTful 网络服务,并试图通过 Jersey 客户端调用它。这是我的控制器方法
@RequestMapping(value = "/create",
method = RequestMethod.POST,consumes={MediaType.APPLICATION_JSON_VALUE},
produces={MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<User> createUser(@RequestBody User user ){
User u = null;
HttpStatus statusCode;
try{
userService.create(user);
u = userService.getUserById(user.getId());
statusCode = HttpStatus.CREATED;
}catch(Exception e){
logger.error("Could not create user ", e);
u = null;
statusCode = HttpStatus.CONFLICT;
}
return new ResponseEntity<User>(u, statusCode);
}
当我从 Jersey 客户端调用此 Web 服务时,出现 400 Bad Request 错误。这是调用此服务的客户端
HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("xxxx", "yyyy");
final Client client = ClientBuilder.newClient();
client.register(feature);
WebTarget webTarget = client.target("http://localhost:8080/MyWeb/api").path("user/create");
Form form = new Form();
form.param("id", "jersey");
form.param("firstName", "Jersey");
form.param("lastName", "Client");
/*User user = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), User.class);*/
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
Response response = invocationBuilder.post(Entity.entity(form, MediaType.APPLICATION_JSON_TYPE));
System.out.println(response.getStatus());
System.out.println(response.getStatusInfo());
我尝试在服务和客户端中使用 MediaType
值,但没有任何效果。
我必须告诉你,我对此完全陌生,这就像我第一次接触 RESTful 网络服务。
请帮助我了解我在做什么错误..
我想你是在告诉服务你在有效负载中发送JSON,但你发送的是表单参数,当你这样做时:
form.param("id", "jersey");
以及以下几行,您正在模拟 POST,就像创建带有提交按钮的 HTML 表单一样。
您可能必须在您的客户端中声明一个 class 用户,实例化此 class 的一个对象并将属性填充为:
User user = new User();
user.setId("jersey");
然后在 POST 中发送这个对象(我没有使用 Invocation.Builder
但它确实有一些 post 方法以对象作为参数),Jersey 客户端应该处理在有效负载中发送 JSON 字符串的序列化。