不能使用Volley POST JSON

时间:2017-06-21 18:29:04

标签: java android json post android-volley

我搜索了很多,但无法找出发生了什么。我写了很多这个代码的变体,这是最新的代码。

Android代码

private static void post(@NonNull String url,
                         @NonNull Context context,
                         @NonNull final JSONObject jsonRequest,
                         @NonNull final ServerConnectionAdapter serverConnectionAdapter){
    Log.d(TAG, "post: URL = " + url);
    RequestQueue queue = Volley.newRequestQueue(context);
    JsonObjectRequest postRequest = new JsonObjectRequest(
            Request.Method.POST,
            url,
            jsonRequest,
            serverConnectionAdapter,
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    serverConnectionAdapter.onErrorResponse(null, error);
                }
            }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> map = new HashMap<>();
            // map.put("user", json.toString());
            map.put("user", "{\"id\":-1,\"name\":\"Gustavo Araujo\"}");
            return map;
        }
    };

    queue.add(postRequest);
}

服务器(Java)代码

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println("doPost");
    System.out.println("REQUEST: ");
    for (Map.Entry<String, String[]> e : request.getParameterMap().entrySet()){
        System.out.print("  ");
        System.out.println(e.getKey() + ": " + java.util.Arrays.toString(e.getValue()));
    }

    System.out.println("end");
}

doPost方法输出

doPost
REQUEST: 
end

我一直在为我的屏幕主演这么久以至于我觉得我无法找到错误的位置。我找到了许多例子,有和没有getParams()。我试过了两个,并没有改变任何东西。

ServerConnectionAdapter是我创建的一个抽象类,用于将响应与错误侦听器统一起来。我确信这不是问题,因为它确实与我所拥有的GET一起完美地工作。

String url也不会出错(否则服务器就不会被触发。

jsonRequest也不是问题,因为我已在那里使用null并且根本没有更改结果。

正如我所说,我已经将这段代码主演了几个小时,我的所有假设都可能完全错误,这就是我寻求帮助的原因。

2 个答案:

答案 0 :(得分:0)

您在评论中发布的错误照片告诉我您的请求成功,移动方面没有任何问题。问题来自服务器端。因为当你提出请求时,它会在服务器上运行,但你的服务器没有返回任何适当的Json。它没有返回任何因为你得到那个例外的原因。 Android请求需要一个Json作为回报,但你是服务器没有返回。

问题可能来自应用程序端,原因可能是您没有向服务器发送正确的参数。但据我所知,主要问题来自服务器端。因为所有这些异常都不在服务器端处理。就像参数错误时一样,它应该返回一个带有消息的json,告诉你参数是错误的。

答案 1 :(得分:0)

我做错了。我写doPost方法的方式是我达到了请求参数,就像你访问http://localhost:8080/something?key=value时我不打算做什么。 我需要阅读请求的正文。为此,在Java中,它应该如下面的代码:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // Get the body of the request
    BufferedReader reader = request.getReader();

    // Print each line
    String line;
    while ((line = reader.readLine()) != null){
        System.out.println(line);
    }
}

感谢Zohaib Hassan试图提供帮助。