我想做一个小的REST服务与泽西2.13作为服务器,Vaadin 7.3.3作为“客户端”,但想法是请求可以来自任何地方(不只是Vaadin,这就是为什么我不会在请求时使用bean的原因)。假设用户已经注册并且请求只是检查他是否存在,并返回令牌。我有一个POST URL,https://localhost:8443/logins
,接收泽西JSON响应作为HttpUrlConnector而不是JSON
{
"login-request":
{
"username":<insert username>,
"password":<insert password>
}
}
,并返回:
{
"login-token":
{
"token":<insert token>
}
}
我的客户端请求的代码是:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("https://127.0.0.1:8443/").path(appName + "/logins");
//build JSON Object
HashMap<String, String> userMap = new HashMap<>();
userMap.put("username", user.getUsername());
userMap.put("password", user.getPassword());
//JSON logins request!
JSONObject jsonLoginRequest = new JSONObject();
try {
jsonLoginRequest.put("login-request", userMap);
} catch (JSONException e) {
e.printStackTrace();
}
return target.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(jsonLoginRequest.toString()));
服务器处理代码为:
@POST
@Path("logins")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response generateToken(@Context HttpServletRequest request) {
if (request != null) {
User user;
DBHandshaker handshaker = DBHandshaker.getInstance();
user = handshaker.logUser(request.getParameter("username"), request.getParameter("password"));
if (user != null) {
StringUtil stringUtil = StringUtil.getInstance();
String tokenString = stringUtil.encryptForToken(user.getUsername(), user.getPassword());
HashMap<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", tokenString);
JSONObject jsonLoginResponse = new JSONObject();
try {
jsonLoginResponse.put("login-token", tokenMap);
} catch (JSONException e) {
e.printStackTrace();
}
return Response.ok(jsonLoginResponse.toString(), MediaType.APPLICATION_JSON).build();
} else {
return Response.status(Response.Status.UNAUTHORIZED).build();
}
} else {
return Response.status(Response.Status.NO_CONTENT).build();
}
}
而我的客户端响应“守望者”是:
LoginParser loginParser = new LoginParser();
Response response = loginParser.parseRequest(username, password);
boolean isValidLogin = Response.Status.OK.getStatusCode() == response.getStatusInfo().getStatusCode();
if (isValidLogin) {
// Store the current username in the service session
getSession().setAttribute("user", username);
HttpEntity entity = (HttpEntity) response.getEntity();
try {
String retSRc = EntityUtils.toString(entity);
JSONObject jsonObject = new JSONObject(retSRc);
System.out.println(jsonObject);
} catch (IOException | JSONException e) {
e.printStackTrace();
}
// Navigate to main view
getUI().getNavigator().navigateTo(LoginMainView.NAME);//
}
我在上response.getEntity()的问题,因为它既不JSON或HttpEntity,但org.glassfish.jersey.client.HttpUrlConnector。我的错误在哪里?得到响应
希望以后
我的第一个建议是使用JAXB/JSON注释类和Jackson清理代码 - 您可以简单地将用户名和密码传递给构造函数,并相应地设置token属性。只需将服务器端的实体设置为JAXB注释类的实例,就可以得到更简洁的代码。一般来说,你可能更愿意使用'Response.ok()。entity(jsonObject).build()',因为球衣已经从注释中知道要生成Json。根据您的设置,相应的ResponseWriter可能已被注册。 – 2014-11-02 07:38:43
这个问题解决了吗?如果是这样,问题在哪里? – tareq 2017-05-24 11:53:22