我写了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;
}
我尝试了MultipartEntity
和NameValuePair
,但都没有奏效。你能告诉我如何处理这个问题吗?
答案 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;
}