【问题标题】:Not able to post params in form url-encoded through volley in android无法通过 android 中的 volley 以 url 编码的形式发布参数
【发布时间】:2017-01-09 12:55:25
【问题描述】:

我正在尝试使用 api(用 PHP 编写)并使用它发布参数。 这是我的代码:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
            url, null,
            new com.android.volley.Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    System.out.println("prerna succes volley "+response.toString());
                }
            }, new com.android.volley.Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

            System.out.println("prerna fail volley "+error.toString());
        }
    })


    {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> pars = new HashMap<String, String>();
            pars.put("Content-Type", "application/x-www-form-urlencoded");
            return pars;
        }


        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("action", "login");
            params.put("username", "abc@xyz.com");
            params.put("pass", "a");
            return params;
        }

    };

如果用户名和密码无效,我总是得到在 api 中处理的无效用户名/密码。在这种情况下,api 没有收到参数。 我尝试通过改造来做到这一点,并且它可以正常工作,这意味着 API 编码没有问题。如果凌空抽射,我在这里错过了什么?

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    尝试迁移到getHeaders 并删除getParams

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("action", "login");
            params.put("username", "abc@xyz.com");
            params.put("pass", "a");
            return pars;
    }
    

    或者 - 重用 getParams 方法

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = getParams();
            params.put("Content-Type", "application/x-www-form-urlencoded");
            return params;
    }
    

    如果是正文请求,您只需添加额外参数即可。

    JSONObject body = new JSONObject();
    body.put("action", "login");
    body.put("username", "abc@xyz.com");
    body.put("pass", "a");
    
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                url, body,
    
                new com.android.volley.Response.Listener<JSONObject>() {
    
                    @Override
                    public void onResponse(JSONObject response) {
                        System.out.println("prerna succes volley "+response.toString());
                    }
                },
     new com.android.volley.Response.ErrorListener() {
    
            @Override
            public void onErrorResponse(VolleyError error) {
    
                System.out.println("prerna fail volley "+error.toString());
            }
        });
    

    【讨论】:

    • 解决方案不起作用..仍然面临同样的问题
    • @PrernaSinghal 那些键值对是正文请求吗?
    • 我的意思是它是正文请求还是标头请求?
    • 这是一个正文请求而不是一个标头请求
    • 好的,我想我知道解决方案了。 1 秒后我会发布答案。
    【解决方案2】:

    如果您以原始格式发送数据,您需要尝试这个,首先将您的数据制作成 json 格式。

    final JSONObject jsonBody = new JSONObject();
                    jsonBody.put("mobile", phoneNumber);
                    jsonBody.put("otp", otp.trim());
    

    你必须重写这些方法

    @覆盖 公共字节[] getBody() 抛出 AuthFailureError { 返回 jsonBody.toString().getBytes(); }

                @Override
                public String getBodyContentType() {
                    return "application/json";
                }
    

    如果您的发布请求中也有标头,您也可以通过以下类型发送该标头

      @Override
                        public Map<String, String> getHeaders() throws AuthFailureError {
                            Map<String, String> params = new HashMap<String, String>();
                            String auth_token = "bearer" + prefs.getPreferencesString(context, "AuthToken").toString();
                            params.put("Authorization", auth_token);
                            return params;
                        }
    

    这是整个代码。

     final JSONObject jsonBody = new JSONObject();
                    jsonBody.put("mobile", phoneNumber);
                    jsonBody.put("otp", otp.trim());
    
                    StringRequest sr = new StringRequest(Request.Method.POST, Constraints.Base_URL + "/api/v1/verifyotp", new com.android.volley.Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                progressDialog.dismiss();
                                JSONObject jsonObject = new JSONObject(response);
                                int status = jsonObject.getInt("status");
                                String token = jsonObject.getString("token");
                                prefs.setPreferencesString(OtpActivity.this, "AuthToken", token);
    
                                if (status == 1) {
    
                                    startActivity(new Intent(getApplicationContext(), WelcomeScreenActivity.class));
                                    overridePendingTransition(R.anim.right_in, R.anim.left_out);
                                } else if (status == 0) {
                                    Toast.makeText(OtpActivity.this, "Please Enter Otp!", Toast.LENGTH_SHORT).show();
                                }
                            } catch (Exception e) {
    
                            }
                        }
                    }, new com.android.volley.Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
    
                            Toast.makeText(OtpActivity.this, "Invalid otp please try again!!", Toast.LENGTH_SHORT).show();
                            progressDialog.dismiss();
                        }
                    }) {
    
                        @Override
                        public byte[] getBody() throws AuthFailureError {
                            return jsonBody.toString().getBytes();
                        }
    
                        @Override
                        public String getBodyContentType() {
                            return "application/json";
                        }
                    };
    
                    MyApplication.getInstance().addToReqQueue(sr, "jreq");
                }
            } catch (Exception e) {
    
            }
    

    【讨论】:

    • 你应该为你的答案添加一些解释。
    【解决方案3】:

    感谢您的支持。我可以通过将 JsonObjectRequest 更改为 StringRequest 来解决问题。我发现Volley JsonObjectRequest Post parameters no longer work 在那里我知道 JsonObjectRequest 会产生一些意想不到的问题。 有我的代码:

        StringRequest jsonObjReq = new StringRequest(Request.Method.POST,
                url,
                new com.android.volley.Response.Listener<String>() {
    
                    @Override
                    public void onResponse(String response) {
    
                        try {
                            JSONObject jsonObject = new JSONObject(response.toString());
                            String no = jsonObject.getString("$PhoneNo");
    
                        } catch (JSONException e) {
    
                        }
                    }
                }, new com.android.volley.Response.ErrorListener() {
    
            @Override
            public void onErrorResponse(VolleyError error) {
    
                System.out.println("prerna fail volley " + error.toString());
            }
        })
    
    
        {
            @Override
            public String getBodyContentType() {
                Map<String, String> pars = new HashMap<String, String>();
                pars.put("Content-Type", "application/x-www-form-urlencoded");
                //return pars;
                return "application/x-www-form-urlencoded";
            }
    
    
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("action", "login");
                params.put("username", "abc@xyz.com");
                params.put("pass", "a");
                return params;
            }
    
        };
    

    但是我仍在试图弄清楚为什么 JsonobjectRequest 不起作用。

    【讨论】:

      【解决方案4】:

      据我所知,通过查看JsonObjectRequest,您的第三个参数为空,它表示 JsonObject 请求 - 由文档“jsonRequest - 与请求一起发布的 JSONObject。允许为空并表示没有参数将随请求一起发布。”

      然后再搜索,我看到了this thread

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2015-12-23
        • 1970-01-01
        • 2018-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多