2014-11-02 63 views
2

我想做一个小的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。我的错误在哪里?得到响应

希望以后

+0

我的第一个建议是使用JAXB/JSON注释类和Jackson清理代码 - 您可以简单地将用户名和密码传递给构造函数,并相应地设置token属性。只需将服务器端的实体设置为JAXB注释类的实例,就可以得到更简洁的代码。一般来说,你可能更愿意使用'Response.ok()。entity(jsonObject).build()',因为球衣已经从注释中知道要生成Json。根据您的设置,相应的ResponseWriter可能已被注册。 – 2014-11-02 07:38:43

+0

这个问题解决了吗?如果是这样,问题在哪里? – tareq 2017-05-24 11:53:22

回答

2

客户端处理代码

package net.test; 

import java.util.HashMap; 

import org.codehaus.jettison.json.JSONException; 
import org.codehaus.jettison.json.JSONObject; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 

public class Consumer { 
    public static void main(String[] args) { 
     Client client = Client.create(); 
     ClientResponse clientResponse = null; 

     User u = new User(); 
     u.setUsername("hello"); 
     u.setPassword("hello"); 
     WebResource webResource = client 
      .resource("http://localhost:8080/"+appName"+/logins"); 
     HashMap<String, String> userMap = new HashMap<String, String>(); 
     userMap.put("username", u.getUsername()); 
     userMap.put("password", u.getPassword()); 
     // JSON logins request! 
     JSONObject jsonLoginRequest = new JSONObject(); 
     try { 
      jsonLoginRequest.put("login-request", userMap); 
      System.out.println(jsonLoginRequest.get("login-request")); 
      System.out.println(jsonLoginRequest.getJSONObject("login-request") 
       .get("username")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     // POST Operation 
     clientResponse = webResource.post(ClientResponse.class, 
      jsonLoginRequest); 
     System.out.println(jsonLoginRequest); 
    // Send the return value in object 
     String result = clientResponse.getEntity(String.class); 
     System.out.println(result); 
} 
} 

服务器处理代码

package net.test; 
//Server Processing code 
import java.util.HashMap; 
import java.util.Random; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import org.codehaus.jettison.json.JSONException; 
import org.codehaus.jettison.json.JSONObject; 

@Path("/") 
public class Producer { 
    @POST 
    @Path("logins") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response generateToken(String objInputData) { 

    JSONObject jsonObject = null; 
    User user = null; 
    String username = null; 
    String password = null; 
    try { 
     jsonObject = new JSONObject(objInputData); 
     user = new User(); 
     username = jsonObject.getJSONObject("login-request") 
       .get("username").toString(); 
     password = jsonObject.getJSONObject("login-request") 
       .get("password").toString(); 
     // Your business logic goes here 
     // DBHandshaker handshaker = DBHandshaker.getInstance(); 
     // user = handshaker.logUser(username, password); 
     System.out.println(username+password); 
     if (user != null) { 
      // write your logic to generate token 
      // StringUtil stringUtil = StringUtil.getInstance(); 
      // String tokenString = 
      // stringUtil.encryptForToken(user.getUsername(), 
      // user.getPassword()); 
      // dummy string to test 
      String tokenString = "Helllllllllgjdkg"; 

      HashMap<String, String> tokenMap = new HashMap<String, String>(); 
      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(); 
     } 
    } catch (Exception e1) { 
     return Response.status(Response.Status.NO_CONTENT).build(); 
    } 
} 
} 

写捕手逻辑这个答案是你

+0

问题在于Jersey 1.x正在客户端使用,请参阅import com.sun.jersey.api.client.Client。我刚开始提到我正在使用Jersey 2.13,并且客户端上的许多事情都发生了变化...... – 2014-11-02 14:13:37

0

代替response.getEntity()有帮助,使用response.readEntity(String.class)response.readEntity(HttpEntity.class)