如何将JSON数据作为参数从Android发送到Jersey RESTful Service

时间:2013-05-16 16:41:48

标签: android json web-services rest post

我正在为我的Android应用创建一个登录功能,该功能将连接到Jersey RESTful Web服务。作为服务调用的一部分,我将发送一个JSON对象,但我现在的问题是我不知道如何解密Web服务端的JSON。这是我的代码:

Android(AsyncTask - doInBackground):

try {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost post = new HttpPost(
            "http://X.X.X.X:8080/HearIt/services/AuthMySQL");
    post.setHeader("content-type", "application/json");

    JSONObject dato = new JSONObject();
    dato.put("email", params[0]);
    dato.put("password", Object_Cipher.init(params[1]));

    StringEntity entity = new StringEntity(dato.toString());
    post.setEntity(entity);
    HttpResponse resp = httpClient.execute(post);
    return EntityUtils.toString(resp.getEntity());

} catch (Exception E) {
    E.printStackTrace();
}

网络服务:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })   
public String AuthMySQL("WHAT I NEED PUT HERE") {
    return "none";
}

为了能够获取JSON数据,我需要做什么?感谢。

2 个答案:

答案 0 :(得分:1)

我建议您阅读JAX-RS中的Request and Response entities。您还应该阅读JAX-RS specification的第3.3节,因为它涵盖了如何处理JAX-RS中的参数的(非常)技术方面。在最简单的情况下,您可以简单地为资源方法提供一个字符串参数,并将传入的数据(JSON)存储到其中:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })   
public String AuthMySQL(String json) {
    System.out.println("The JAX-RS runtime automatically stored my JSON request data: " + json);
}

当然,这并没有利用JAX-RS可以提供​​的自动映射。正确设置后,运行时实际上可以将传入数据直接反序列化为Java类(假设您已创建了一个)。因此,例如,给定以下类:

class LoginData {
    private String email;
    private String password;

    // constructors, getters/setters
}

您可以选择直接将请求数据编组到其中:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })   
public String AuthMySQL(LoginData data) {
    System.out.println("The JAX-RS runtime automatically deserialized my JSON request data: " + data);
}

要成功完成此操作,您需要在应用程序中包含jersey-json模块。

答案 1 :(得分:0)

我会尝试为您提供一个通用示例。

假设您要使用以下JSON:

{ "user": {
    "name": "john",
    "age": 20,
    "country": "austria"
    }
}

您必须创建以下类:

class User {
    String name;
    Integer age;
    String country;

    // getters, setters, whatevers
}

并在网络服务中:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })   
public String consumeUserName(User user) {
    return user.getName();
}