使用从HttpPost发送的Jersey和Android设备接收JSON变量

时间:2013-02-19 18:57:40

标签: java android rest jersey

我有一个使用HttpPost发送数据的Android代码:

public static void sendRideIdAndEmail(String rideId,String email){
    HttpClient client = new DefaultHttpClient();
    HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
    HttpResponse response;
    JSONObject json = new JSONObject();

    try {
        HttpPost post = new HttpPost("http://192.168.1.59/FareShareREST/api/rides/joinRide");
        json.put("rideid", rideId);
        json.put("emailid", email);
        Log.v("RideEmailJson",json.toString());
        StringEntity se = new StringEntity( json.toString());  
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        post.setEntity(se);
        response = client.execute(post);

        /*Checking response */
        if(response!=null){
            InputStream in = response.getEntity().getContent(); //Get the data in the entity
        }

    } catch(Exception e) {
        e.printStackTrace();
        Log.v("Error", "Cannot Estabilish Connection");
    }

}

我在Tomcat 7上运行服务器端的RestFul Post方法:

   @POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("joinRide")
public Response joinRide(@PathParam("rideid") long rideid,@PathParam("emailid") String     emailid) {
    System.out.println(emailid);
    Ride ride=rideRepository.getRideById(rideid);
    UserDetail userDetail=userRepository.getUserDetailbyEmailId(emailid);
    User user=new User();
    user.setName(userDetail.getName());
    user.setRegistrationId(userDetail.getRegistrationId());
    rideRepository.addUserToRide(ride, user);
    return Response.ok().build();
}

但我总是收到电子邮件ID为null。我尝试过使用@FormParam。但那似乎没有用。

有人可以向我提供任何帮助吗?

1 个答案:

答案 0 :(得分:0)

从传入请求URL中提取路径参数(@PathParam)。因此,例如,使用网址http://192.168.1.59/FareShareREST/api/rides/joinRide/5和以下代码:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/joinRide/{rideid}")
public Response joinRide(@PathParam("rideid") long rideid) {
    System.out.println(rideid);
}

您会rideid映射到55的值来自映射的网址部分(/joinRide/{id})。 但是 ,这对您的方案没有用处 - 您正在创建一个JSON对象并将其包含在请求正文中。在这种情况下,在服务器端,JAX-RS提供程序会将此请求正文映射到资源方法上的第一个符合条件的参数。您需要与此类似的代码:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/joinRide")
public Response joinRide(String json) {
    System.out.println(json);
}

这会将您的JSON字符串直接设置为变量,如此巧妙地命名为json。当然,您需要解析JSON以获取其中的数据,您可能不想这样做。在这种情况下,创建一个包含预期数据字段的简单POJO,并在资源方法中使用它:

public class EmailInfo implements Serializable {
    private String rideId;
    private String email;

    // Constructors, Getters/Setters
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/joinRide")
public Response joinRide(EmailInfo info) {
    System.out.println(info.getRideId());
    System.out.println(info.getEmail());
}