我在Tomcat服务器上部署了REST服务。此服务具有带端点createUser的POST方法,以及以下方法:
@Path("/myService")
public class MyClass {
@POST
@Path("/createUser")
public Response createUser(@Context UriInfo info) {
String user = info.getQueryParameters().getFirst("name");
String password = info.getQueryParameters().getFirst("password");
if (user == null || password == null) {
return Response.serverError().entity("Name and password cannot be null").build();
}
//do stuff...
return Response.ok().build()
}
通过使用SoapUI调用此方法,一切都很顺利。我部署了我的服务器并向其发送帖子(http://my_IP:8080/myApplication/myService/createUser)。
现在我想从我的Android应用程序中调用它。我正在尝试使用Volley库。第一个测试是使用GET请求(来自我的tomcat的其他端点)并且没有问题。但是,当我尝试调用此端点并创建用户时,该方法在Tomcat中触发,但不检索任何参数(这意味着用户和密码为空)。这是我的Android代码:
private void sendPostRequest(final String user, final String password) {
final Context context = getApplicationContext();
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
final String URL = "http://my_IP:8080/myApplication/myService/createUser";
StringRequest strRequest = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("name", user);
params.put("password", password);
return params;
}
};
mRequestQueue.add(strRequest);
}
我做错了什么?我还尝试使用JSONObjects更改Android调用(保持REST服务器完好无损),并使用以下代码:
private void sendPostRequest (final String user, final String password) {
final Context context = getApplicationContext();
final String URL = "http://my_IP:8080/myApplication/myService/createUser";
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
Map<String, String> postParam= new HashMap<String, String>();
postParam.put("name", user);
postParam.put("password", password);
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
URL, new JSONObject(postParam),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(context, response.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
headers.put( "charset", "utf-8");
return headers;
}
};
mRequestQueue.add(jsonObjReq);
}
非常感谢任何帮助。谢谢!
更新:解决了@ dev.bmax的提示。我不得不修改我的REST服务器并获取整个请求(不仅是URIInfo):
@Path("/myService")
public class MyClass {
@Context Request request;
@Context UriInfo info;
@POST
@Path("/createUser")
public Response createUser() {
HttpRequestContext req = (HttpRequestContext) request;
String params = req.getEntity(String.class);
HashMap<String, String> props = Helper.unparseEntityParams(params);
if (props.get("username") == null || props.get("password") == null) {
return Response.serverError().entity("Name and password cannot be null").build();
}
//do stuff...
return Response.ok().build()
}
}
答案 0 :(得分:0)
后端的示例代码使用UriInfo的getQueryParameters()方法提取params。这对于GET方法来说很好。 但是,如果您使用相同的代码尝试提取POST请求的参数,那么它将无法工作,因为它们不包含在URL中。 而不是你应该使用类似的东西:
String userName = request.getParameter("name");
String password = request.getParameter("password");