具有关键值参数的Volley Post

时间:2015-10-14 05:41:01

标签: java android rest android-volley

我在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()
    }
}

1 个答案:

答案 0 :(得分:0)

后端的示例代码使用UriInfo的getQueryParameters()方法提取params。这对于GET方法来说很好。 但是,如果您使用相同的代码尝试提取POST请求的参数,那么它将无法工作,因为它们不包含在URL中。 而不是你应该使用类似的东西:

String userName = request.getParameter("name");
String password = request.getParameter("password");