Получавайте JSON променливи с помощта на Jersey изпратено от и устройство с 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
Добре. Тогава за предпочитане ще направя Wrapper Class като EmailInfo и ще го направя. Благодаря - person user1827423; 19.02.2013