Android:将表单数据作为正文Google Volley发送

时间:2016-06-12 11:43:00

标签: android rest android-volley multipartform-data

在我的Android应用程序中,我使用谷歌的凌空进行网络操作。在某种情况下,我需要发出请求,但发送body作为表单数据。 我已尝试过其他所有内容,但我无法将请求作为表单数据发送。

这是一个卷曲

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

我怎样才能在截击中实现-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;
            }
        };

请帮助我。

1 个答案:

答案 0 :(得分:2)

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

创建正文的代码:

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;
            }