【问题标题】:Android : Sending form-data as body Google VolleyAndroid:将表单数据作为正文发送 Google Volley
【发布时间】:2016-06-12 11:43:00
【问题描述】:

在我的 Android 应用程序中,我使用 google 的 volley 进行网络操作。有一种情况,我需要发出请求,但将正文作为表单数据发送。 我已经尝试了其他所有方法,但我无法将请求作为表单数据。

这是卷曲

curl -X POST -H "Content-Type: multipart/form-data" -F "mobile_number=<XXXX>" "<server_url>"

我怎样才能在 volley 中实现 -F 部分?服务器正在抛出错误的请求。

这就是我所做的:

final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, URLFactory.OTP_URL,
                null, listener, errorListener){

            @Override
            public byte[] getBody() {
                final JSONObject  jsonObject = new JSONObject();
                try {
                    jsonObject.put("mobile_number", mobileNumber);
                } catch (JSONException e) {
                    e.printStackTrace();
                    return null;
                }
                return jsonObject.toString().getBytes();
            }


            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                final HashMap<String, String> headers = new HashMap<>();
                headers.put("Content-Type", "multipart/form-data");
                return headers;
            }
        };

请帮帮我。

【问题讨论】:

标签: android rest android-volley multipartform-data


【解决方案1】:

这可以通过自己创建 postBody 在 volley 中完成。请参考以下代码。

创建正文的代码:

private String createPostBody(Map<String, String> params) {
        StringBuilder sbPost = new StringBuilder();
         for (String key : params.keySet()) {
                if (params.get(key) != null) {
                    sbPost.append("\r\n" + "--" + BOUNDARY + "\r\n");
                    sbPost.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n\r\n");
                    sbPost.append(params.get(key));
                }
            }

        return sbPost.toString();
    }

修改 getBody() 代码:

  @Override
            public byte[] getBody() {
                Map<String,String> params = new HashMap<>();
                params.add("mobile_number", mobileNumber);
                String postBody = createPostBody(params);

                return postBody.getBytes();
            }

您还需要修改 getHeaders 以告诉服务器您的边界是什么:

 @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                final HashMap<String, String> headers = new HashMap<>();
                headers.put("Content-Type", "multipart/form-data;boundary=" + BOUNDARY;);
                return headers;
            }

【讨论】:

  • 什么是边界? sbPost.append("\r\n" + "--" + BOUNDARY + "\r\n");
  • 这是服务器用来拆分帖子正文中收到的不同参数的字符串。您可以参考以下链接:stackoverflow.com/questions/3508338/…
  • 我也添加了 getHeader() 函数。您可以将任何字符串定义为边界。例如。私有静态最终字符串 BOUNDARY = "s2retfgsGSRFsERFGHfg";
猜你喜欢
  • 2021-02-23
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2019-02-25
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多