У меня есть служба REST, развернутая на сервере Tomcat. Эта служба имеет метод POST с конечной CreateUser, и следующий метод:Volley 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()
}
}
Вы проверили то, что стоимость нового JSONObject (postParam)? –
Проверьте это link.http: //stackoverflow.com/questions/23220695/send-post-request-with-json-data-using-volley –