Получение переменных JSON с использованием Джерси, отправленного с устройства Android, с помощью HttpPost

У меня есть код Android для отправки данных с помощью HttpPost:

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");
    }

}

У меня есть метод RestFul Post на стороне сервера, работающий на Tomcat 7:

   @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();
}

Но я всегда получаю идентификатор электронной почты как null. Я пытался использовать @FormParam. Но это, похоже, не работает.

Может ли кто-нибудь оказать мне какую-либо помощь?


person user1827423    schedule 19.02.2013    source источник


Ответы (1)


Параметры пути (@PathParam) извлекаются из URL-адреса входящего запроса. Так, например, с URL-адресом 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 с 5. Значение 5 исходит из той части URL, которая была сопоставлена ​​(/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());
}
person Perception    schedule 19.02.2013
comment
Спасибо. Но я хотел передавать в POST только те переменные, которые можно получить на сервере. я там в любом случае - person user1827423; 19.02.2013
comment
Итак, ваша серверная часть исправлена, но вы можете изменить клиентскую часть? - person Perception; 19.02.2013
comment
Я просто хочу опубликовать переменные из своего приложения для Android. Чтобы его можно было получить на сервере - person user1827423; 19.02.2013
comment
Извините, я не слежу за вами. Если вы не можете изменить серверную часть, вам нужно будет добавить те переменные, которые вы пытаетесь передать, к URL-адресу (например: 192.168.1.59/FareShareREST/api/rides/joinRide/5/[email protected]). Обратите внимание, что вам придется кодировать URL-адрес из-за адреса электронной почты в нем. С другой стороны, если вы можете изменить серверную сторону, просмотрите мой ответ и измените свой код, чтобы он соответствовал. - person Perception; 19.02.2013
comment
Ok. Тогда я предпочту создать класс-оболочку, например EmailInfo, и сделать это. Спасибо - person user1827423; 19.02.2013