【问题标题】:Can't POST JSON using Volley无法使用 Volley 发布 JSON
【发布时间】:2017-06-21 18:29:03
【问题描述】:

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

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 并且根本没有改变结果。

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

【问题讨论】:

  • Android Studio 的 Log-cat 中是否显示任何错误或警告?
  • Method calling postoutput。剩下的输出只是我自己验证其他数据的日志。

标签: java android json post android-volley


【解决方案1】:

您在评论中发布的错误照片告诉我您的请求已成功,移动端没有任何问题。问题出在服务器端。因为当您发出请求时,它会在服务器上进行,但您的服务器没有返回任何正确的 Json。它什么也没返回,这就是你得到那个例外的原因。 Android 请求需要一个 Json 作为回报,但您的服务器没有返回它。

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

【讨论】:

  • 我明白了,现在不是问题了。我想知道为什么服务器没有从 android 接收任何 JSON。正如我发布的服务器端的输出是空的,但 android 端的 POST 似乎是正确的。
  • 我是App Developer,对服务器端了解不多。但我会做一些研究并试图弄清楚。如果我找到任何解决方案,我会尽快与您联系。
【解决方案2】:

我做错了。我编写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 提供的帮助。

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多