Volley JsonObjectRequest Post 请求忽略参数

Posted

技术标签:

【中文标题】Volley JsonObjectRequest Post 请求忽略参数【英文标题】:Volley JsonObjectRequest Post request ignoring params 【发布时间】:2014-06-25 17:06:15 【问题描述】:

我正在尝试使用 volley 连接到 API,我正在设置所有参数和标头,但似乎这些参数被忽略了,我在这里缺少什么?我上周开始学习 android volley,我有点迷茫。

    package com.rep.app.principal;

    import android.os.AsyncTask;
    import android.os.Bundle;

    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;

    import com.actionbarsherlock.app.SherlockFragmentActivity;
    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.VolleyLog;
    import com.android.volley.toolbox.JsonObjectRequest;
    import com.android.volley.toolbox.Volley;
    import com.rep.R;


    import org.json.JSONObject;

    import java.util.HashMap;

    import java.util.Map;


    public class InicioActivity extends SherlockFragmentActivity 


       RequestQueue queue = null;




        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            txtDisplay = (TextView) findViewById(R.id.txtDisplay);

            queue=Volley.newRequestQueue(this);


            AutenticacaoLocalTask mAutenticacaoLocalTask = new AutenticacaoLocalTask();
            mAutenticacaoLocalTask.execute((Void) null);

        
        private TextView txtDisplay;



        public class AutenticacaoLocalTask extends AsyncTask<Void, Void, Boolean> 

            @Override
            protected Boolean doInBackground(Void... params) 


                try 


                    txtDisplay = (TextView) findViewById(R.id.txtDisplay);

                    String url = "http://192.168.1.18/opa/api/";


                   JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,url,null,
                        new Response.Listener<JSONObject>() 
                            @Override
                            public void onResponse(JSONObject response) 
                                System.out.println(response);

                            
                        ,
                        new Response.ErrorListener() 
                            @Override
                            public void onErrorResponse(VolleyError error) 

                            
                        )

                   

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError 

                        HashMap<String, String> headers = new HashMap<String, String>();
                        headers.put("TOKEN", "99KI9Gj68CgCf70deM22Ka64chef2C40Gm2lFJ2J0G9JkDaaDAcbFfd19MfacGf3FFm8CM1hG0eDiIk8");

                        return headers;
                    

   @Override 
                protected Map<String, String> getParams() 
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("email", "rm@test.com.br");
                    params.put("senha", "aaa");

                    return params;
                
          ;    

              queue.add(jsObjRequest);
                    return true;

                 catch (Exception e) 
                    Log.e("RM", e.getMessage());
                    return false;
                

            

            @Override
            protected void onPostExecute(final Boolean success) 

            

            @Override
            protected void onCancelled() 

            
        


    

【问题讨论】:

您似乎在问两个重复的问题,here 是您之前的问题并且您接受了答案,为什么还要问这个? 【参考方案1】:

很明显,有时我们需要在点击url的同时提交请求参数。为此,我们必须重写 getParams() 方法,该方法应返回要以键值格式发送的参数列表。

所以,将getParams() 中的JsonObjectRequest 覆盖为

            @Override 
            protected Map<String, String> getParams() 
                Map<String, String> params = new HashMap<String, String>();
                params.put("email", "rm@test.com.br");
                params.put("senha", "aaa");

                return params;
            

即使用下面的代码作为

 JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,url,null,
                        new Response.Listener<JSONObject>() 
                            @Override
                            public void onResponse(JSONObject response) 
                                System.out.println(response);

                            
                        ,
                        new Response.ErrorListener() 
                            @Override
                            public void onErrorResponse(VolleyError error) 

                            
                        )

                   

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError 

                        HashMap<String, String> headers = new HashMap<String, String>();
                        headers.put("TOKEN", "99KI9Gj68CgCf70deM22Ka64chef2C40Gm2lFJ2J0G9JkDaaDAcbFfd19MfacGf3FFm8CM1hG0eDiIk8");

                        return headers;
                    

   @Override 
                protected Map<String, String> getParams() 
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("email", "rm@test.com.br");
                    params.put("senha", "aaa");

                    return params;
                
          ;

欲了解更多信息,请参阅Android working with Volley Library

编辑:

401 是“未授权”的状态码。如果您在尝试 HTACCESS 时遇到 401,请参阅question。您需要使用Authenticator 传递参数。

【讨论】:

仍然收到错误 401,如果我从服务器中删除密码和电子邮件,只留下令牌作为安全性,它可以完美运行 @AndroidEnthusiast 检查我的答案【参考方案2】:

不要将参数放在请求中,而是尝试使用JsonObjectRequest 对象的第三个参数,它是一个 JSON 对象(我的代码中的 jsonobj)。

类似:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, URL, jsonobj, new Response.Listener<JSONObject>() 

    @Override
    public void onResponse(JSONObject response) 
        System.out.println("onResponse()");

        ...
    
);

查看我的答案here。

【讨论】:

以上是关于Volley JsonObjectRequest Post 请求忽略参数的主要内容,如果未能解决你的问题,请参考以下文章

Volley JsonObjectRequest Post 参数不再起作用

Volley JsonObjectRequest Post 请求忽略参数

带有参数的 Volley jsonObjectRequest 不起作用

Android-Volley网络通信框架(StringRequest &amp; JsonObjectRequest)

Volley JsonObjectRequest Post 请求不起作用

Volley Post JsonObjectRequest 在使用 getHeader 和 getParams 时忽略参数