如何在客户端使用queryparam调用Json Post请求?

时间:2016-08-29 07:18:02

标签: java android json service

我写了Service和CLient部分的应用程序。我使用“Postman”应用程序测试了我的服务,它与url = http://192.168.2.50:8084/FaceBusinessService/webresources/service/login?phone=123456789&password=1234

一起正常运行

然而,当我尝试在我的Android应用程序上调用它时,它无法正常工作。在服务端调试时,我看到手机和密码参数为NULL。

这是我的服务方:

    @Path("login")
    @POST
    @Produces("application/json")
    public String postJson(@QueryParam("phone")String phone, @QueryParam("password") String password) {

        String info = null;      
        try {
            UserInfo userInfo  = null;
            UserModel userModel = new UserModel();
            userInfo = userModel.isPersonRegistered(phone, password);

            Gson gson = new Gson();
            System.out.println(gson.toJson(userInfo));
            info = gson.toJson(userInfo);                        
        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
        }

        return info;
    }

这是我的Android应用程序端:

    private UserInfo loginUser(String phone, String password) {
        UserInfo userInfo = null;

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://192.168.2.27:8084/FaceBusinessService/webresources/service/login");


        try {
            /*
            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            entity.addPart("phone", new StringBody(phone));
            entity.addPart("password", new StringBody(password));

            post.setEntity(entity);
            */

            List<NameValuePair> params = new ArrayList<NameValuePair>(2);
            params.add(new BasicNameValuePair("phone", phone));
            params.add(new BasicNameValuePair("password", password));
            post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));


            Log.d(TAG, "POST String: " + post.toString());

            try {
                HttpResponse response = httpClient.execute(post);

                if (response.getEntity().getContentLength() > 0) {
                    String json_string = EntityUtils.toString(response.getEntity());
                    JSONObject jsonObject = new JSONObject(json_string);

                    // TODO

                    return userInfo;
                }


            } catch (IOException e) {
                e.printStackTrace();
                return null;
            } catch (JSONException e) {
                e.printStackTrace();
                return null;
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }

        return null;
    }

我尝试了MultipartEntityNameValuePair,但都没有奏效。你能告诉我如何处理这个问题吗?

1 个答案:

答案 0 :(得分:0)

请注意,在使用Postman进行测试时,您将参数(用户名和密码)作为URL(URL编码)的一部分传递,可以在服务器端直接检索。 (你甚至不需要POST请求)。您的对象作为字符串对象传递,而不是JSON对象。

在您的客户端代码中,URL是不同的,因为您将参数编码为POST请求实体(有效负载)的一部分。参数打包在请求/消息正文内部而不是URL中。

现在,由于您的URL没有参数,您应该通过反序列化请求来检索它们(将JSON请求反序列化为UserInfo对象)。

请注意,您应该完全重写服务器端代码,因为它应该接受应用程序/ JSON对象,但它显然应该返回/生成一个String对象(普通/文本或应用程序/ HTML)。

我不熟悉GSON,但您的代码可能类似于

@Path("login")
@POST
@Produces("text/plain")
@Consumes("application/json")
public String postJson(UserInfo ui) {

    String info = null;      
    try {
        UserInfo userInfo  = null;
        UserModel userModel = new UserModel();
        userInfo = userModel.isPersonRegistered(ui.phone, ui.password);

        Gson gson = new Gson();
        System.out.println(gson.toJson(userInfo));
        info = gson.toJson(userInfo);                        
    } catch (Exception e) {
        System.out.println("Exception: " + e.getMessage());
    }

    return info;
}