2015-10-14 2 views
0

У меня есть служба 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() 
    } 
} 
+0

Вы проверили то, что стоимость нового JSONObject (postParam)? –

+0

Проверьте это link.http: //stackoverflow.com/questions/23220695/send-post-request-with-json-data-using-volley –

ответ

0

Пример код Админцетр извлекает Params с getQueryParameters() метод UriInfo. И это отлично подходит для метода GET. Но если вы используете тот же код, пытающийся извлечь параметры запроса POST, то это не сработает, потому что они не включены в URL-адрес. Вместо того, что вы должны использовать что-то вроде:

String userName = request.getParameter("name"); 
String password = request.getParameter("password"); 
Смежные вопросы