使用 Volley 在正文中发布表单数据参数

Posted

技术标签:

【中文标题】使用 Volley 在正文中发布表单数据参数【英文标题】:Posting form-data Parameters in the body using Volley 【发布时间】:2017-02-04 16:19:58 【问题描述】:

这是使用邮递员完成的发布请求

我想得到的回应是:

    
  "result": "success",
  "reason": 
    "first_name": "aswath",
    "last_name": "AsH",
    "email": "selviragu09@gmail.com",
    "phone": "\"8867336754\"",
    "authy_id": "26829982",
    "updated_at": "2016-09-27 06:38:07",
    "created_at": "2016-09-27 06:38:07",
    "id": "5012"
  ,
  "sms": "token sent"

这是我要发送的请求:

 JSONObject jsonBody = new JSONObject();
        jsonBody.put("first_name", firstname);
        jsonBody.put("last_name", lastName);
        jsonBody.put("email", Email);
        jsonBody.put("phone", number);

        final String mRequestBody = jsonBody.toString();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() 

            @Override
            public void onResponse(String response) 
                Log.i("VOLLEY", response);
                Log.d("**********", "FETCHING IN VOLLEY REQ" + response.toString());


            
        , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 
                Log.e("VOLLEY", error.toString());
            
        ) 
            @Override
            public String getBodyContentType() 
                return "application/json; charset=utf-8";
            


            @Override
            public byte[] getBody() throws AuthFailureError 
                try 
                    return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
                 catch (UnsupportedEncodingException uee) 
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
                    return null;
                
            


            @Override
            public Map<String, String> getHeaders() throws AuthFailureError
            
                Map<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "multipart/form-data");
                return headers;
            
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) 
                String responseString = "";
                if (response != null) 
                    responseString = String.valueOf(response.statusCode);
                    // can get more details such as response.headers
                
                return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
            
        ;

        getRequestOtpPage().addToRequestQueue(stringRequest);

但是当我发布请求时它返回错误!

如何解决问题?

【问题讨论】:

尝试实现 getParams() 并传递简单的键值对而不是 json 对象 试过了,收到错误响应。发送的所有数据都是正确的。 去掉getHeaders()方法再试试。 ***.com/questions/39609776/… 试试这个,做一些通用的东西,这将帮助你实现你想要的 查看这个***.com/questions/28344448/… 【参考方案1】:

只需尝试以下代码,这将用于使用 volley 发送简单的帖子数据,只需替换 URL 和参数数据。

StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                    new Response.Listener<String>() 
                        @Override
                        public void onResponse(String response) 
                            Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
                        
                    ,
                    new Response.ErrorListener() 
                        @Override
                        public void onErrorResponse(VolleyError error) 
                            Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                        
                    )
                @Override
                protected Map<String,String> getParams()
                    Map<String,String> params = new HashMap<String, String>();
                    params.put(KEY_USERNAME,username);
                    params.put(KEY_PASSWORD,password);
                    params.put(KEY_EMAIL, email);
                    return params;
                

            ;

            getRequestOtpPage().addToRequestQueue(stringRequest);

【讨论】:

为什么它不能使用 JsonObjectRequest 而是使用 StringRequest? @QadirHussain 我有同样的问题,凌空创作者应该回答这个问题。 如果需要基本身份验证,我将基本身份验证放在哪里? @Override public Map getHeaders() throws AuthFailureError HashMap params = new HashMap(); String creds = String.format("%s:%s","USERNAME","PASSWORD"); String auth = "基本" + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); params.put("授权", auth);返回参数; 您可以添加 getHeaders() 用于在请求中添加标头

以上是关于使用 Volley 在正文中发布表单数据参数的主要内容,如果未能解决你的问题,请参考以下文章

正文参数不能与表单参数一起使用-带有Headers和json数据的Feign客户端

kotlin volley android POST 多部分/表单数据

Android Volley解析之表单提交篇

如何在 Jmeter 中传递表单数据值?

发布邮递员表单数据时请求正文为空

在搜索表单中发布或获取?