Rest 泽西岛客户没有';不要跟随重定向
我的“用户”资源定义如下:Rest 泽西岛客户没有';不要跟随重定向,rest,jersey,jax-rs,Rest,Jersey,Jax Rs,我的“用户”资源定义如下: @Path("/api/users") public class UserResource { @POST @Consumes(MediaType.APPLICATION_JSON) public Response addUser(User userInfo) throws Exception { String userId; User existing = ... // Look for ex
@Path("/api/users")
public class UserResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addUser(User userInfo) throws Exception {
String userId;
User existing = ... // Look for existing user by mail
if (existing != null) {
userId = existing.id;
} else {
userId = ... // create user
}
// Redirect to the user page:
URI uri = URI.create("/api/users/" + userId);
ResponseBuilder builder = existing == null ? Response.created(uri) : Response.seeOther(uri);
return builder.build();
}
@Path("{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public User getUserById(@PathParam("id") String id) {
return ... // Find and return the user object
}
}
然后,我尝试使用Jersey客户端测试用户创建:
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getFeatures().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, Boolean.TRUE);
Client client = Client.create(clientConfig);
client.addFilter(new LoggingFilter(System.out));
User userInfo = UserInfo();
userInfo.email = "test";
userInfo.password = "test";
client.resource("http://localhost:8080/api/users")
.accept(MediaType.APPLICATION_JSON)
.type(MediaType.APPLICATION_JSON)
.post(User.class, userInfo);
我得到以下例外情况:
严重:Java类com.colabo.model.User的消息体读取器,
Java类型类com.colabo.model.User和MIME媒体类型
text/html;未找到字符集=iso-8859-1
这是HTTP请求的跟踪:
1 * Client out-bound request
1 > POST http://localhost:8080/api/users
1 > Accept: application/json
1 > Content-Type: application/json
{"id":null,"email":"test","password":"test"}
1 * Client in-bound response
1 < 201
1 < Date: Tue, 03 Jul 2012 06:12:38 GMT
1 < Content-Length: 0
1 < Location: /api/users/4ff28d5666d75365de4515af
1 < Content-Type: text/html; charset=iso-8859-1
1 <
1*客户端出站请求
1>职位http://localhost:8080/api/users
1>接受:应用程序/json
1>内容类型:应用程序/json
{“id”:null,“email”:“test”,“password”:“test”}
1*绑定响应中的客户端
1 < 201
日期:2012年7月3日星期二06:12:38 GMT
1<内容长度:0
1<位置:/api/users/4ff28d5666d75365de4515af
1<内容类型:文本/html;字符集=iso-8859-1
1 <
在这种情况下,Jersey客户端是否应该自动遵循重定向,并正确地解组并从第二个请求返回Json对象
谢谢,
Michael跟随重定向意味着跟随状态代码重定向。你得到的是一个响应,不是重定向。如果返回201,您可以在location头之后编写一个 跟随重定向意味着跟随状态代码重定向。你得到的是一个响应,不是重定向。如果返回201,您可以在location头之后编写一个 我也面临同样的问题,并通过遵循客户端过滤器解决了它
package YourPackageName;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
public class RedirectFilterWorkAround implements ClientResponseFilter {
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
if (responseContext.getStatusInfo().getFamily() != Response.Status.Family.REDIRECTION)
return;
Response resp = requestContext.getClient().target(responseContext.getLocation()).request().method(requestContext.getMethod());
responseContext.setEntityStream((InputStream) resp.getEntity());
responseContext.setStatusInfo(resp.getStatusInfo());
responseContext.setStatus(resp.getStatus());
}
}
现在在另一个类中创建客户机作为
Client client = ClientBuilder.newClient();
将此筛选器类应用为
client.register(RedirectFilterWorkAround.class);
这是与泽西2.x的工作
在SO:p上找到这些指针,我遇到了相同的问题,并通过遵循客户端筛选器解决了它
package YourPackageName;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
public class RedirectFilterWorkAround implements ClientResponseFilter {
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
if (responseContext.getStatusInfo().getFamily() != Response.Status.Family.REDIRECTION)
return;
Response resp = requestContext.getClient().target(responseContext.getLocation()).request().method(requestContext.getMethod());
responseContext.setEntityStream((InputStream) resp.getEntity());
responseContext.setStatusInfo(resp.getStatusInfo());
responseContext.setStatus(resp.getStatus());
}
}
现在在另一个类中创建客户机作为
Client client = ClientBuilder.newClient();
将此筛选器类应用为
client.register(RedirectFilterWorkAround.class);
这是与泽西2.x的工作
在SO:p上找到了这些指针,您不会得到重定向代码(3xx),而是创建了一个重定向代码(201)。客户端应该如何重定向?我还认为你应该在帖子中添加@productsmethod@EugenioCuevas但是响应包含“Location”标题,这还不够吗?我尝试添加products注释,但这也没有帮助。您不会得到重定向代码(3xx),而是创建了一个(201)。客户端应该如何重定向?我还认为你应该在帖子中添加@productsmethod@EugenioCuevas但是响应包含“Location”标题,这还不够吗?我尝试添加products注释,但这也没有帮助。有没有关于如何创建遵循重定向的ClientFilter的指针?(我使用的是2.5客户端)有没有关于如何创建遵循重定向的ClientFilter的指针?(我使用的是一个2.5版本的客户端)这对你有用吗?我面临与OP相同的问题(使用PUT而不是POST),并且此筛选器生成错误http方法PUT的
实体不能为null。
我尝试将实体从requestContext传输到下一个请求,例如:resp=requestContext.getClient.target(responseContext.getLocation()).request().PUT(实体)
但也有问题。这对你有用吗?我面临与OP相同的问题(使用PUT而不是POST),并且此筛选器生成错误http方法PUT的实体不能为null。
我尝试将实体从requestContext传输到下一个请求,例如:resp=requestContext.getClient.target(responseContext.getLocation()).request().PUT(实体)
但也有问题。