2015-04-04 25 views
20

我想在Volley JsonObjectRequest中发送POST参数。最初,它正在为我工​​作遵循官方代码所说的在JsonObjectRequest的构造函数中传递包含参数的JSONObject。然后突然它停止工作,我没有对之前的代码做任何改变。服务器不再识别任何POST参数正在发送。这里是我的代码:排气JsonObjectRequest发布参数不再工作

RequestQueue queue = Volley.newRequestQueue(this); 
String url ="http://myserveraddress"; 

// POST parameters 
Map<String, String> params = new HashMap<String, String>(); 
params.put("tag", "test"); 

JSONObject jsonObj = new JSONObject(params); 

// Request a json response from the provided URL 
JsonObjectRequest jsonObjRequest = new JsonObjectRequest 
     (Request.Method.POST, url, jsonObj, new Response.Listener<JSONObject>() 
     { 
      @Override 
      public void onResponse(JSONObject response) 
      { 
       Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }, 
     new Response.ErrorListener() 
     { 
      @Override 
      public void onErrorResponse(VolleyError error) 
      { 
       Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

// Add the request to the RequestQueue. 
queue.add(jsonObjRequest); 

这里是服务器上的简单测试PHP代码:

$response = array("tag" => $_POST["tag"]); 
echo json_encode($response); 

我得到的回应是{"tag":null}
昨天,它工作得很好,并与{"tag":"test"}
是在回应我没有改变一件事,但今天它不再有效。

处抽射源代码构造的javadoc它说,你可以在构造函数传递一个JSONObject以“@参数jsonRequest”送岗位参数: https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java

/**
  *创建新的请求。
  * @参数方法的HTTP方法使用
  * @参数网址URL从
 取JSON * @参数jsonRequest A {@link的JSONObject}发布该请求。空是允许的,
  *              表示没有参数将与请求一起发布。

我已阅读其他职位有类似的问题,但解决方案并没有为我工作:

Volley JsonObjectRequest Post request not working

Volley Post JsonObjectRequest ignoring parameters while using getHeader and getParams

Volley not sending a post request with parameters.

我已经尝试设置JsonObjectRequest构造函数中的JSONObject为null,然后覆盖并设置“getParams()”,“get Body()“和”getPostParams()“方法,但这些覆盖都没有为我工作。另一个建议是使用一个基本上创建自定义请求的辅助类,但该修复对我的需求来说有些复杂。如果归结到它,我会尽一切努力使它工作,但我希望有一个简单的道理,为何我的代码工作,然后就停止,也是一个简单的解。

+0

您是否找到任何解决方案? – Dory 2015-07-23 08:46:22

+0

@Dory是的,我找到了一个简单的解决方案。它没有解决JsonObjectRequest的问题,我完全放弃了JsonObjectRequest,因为解决方案是使用Volley的StringRequest。查看我的答案,看看我做了什么。 – 2015-07-24 13:54:14

+0

检查此链接http://stackoverflow.com/questions/19837820/volley-jsonobjectrequest-post-request-not-working。 – 2015-09-19 13:25:28

回答

26

最后我用乱射的StringRequest而是因为我用了太多宝贵的时间努力工作JsonObjectRequest。

RequestQueue queue = Volley.newRequestQueue(this); 
String url ="http://myserveraddress"; 

StringRequest strRequest = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) 
        { 
         Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 
        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) 
        { 
         Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show(); 
        } 
       }) 
     { 
      @Override 
      protected Map<String, String> getParams() 
      { 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("tag", "test"); 
       return params; 
      } 
     }; 

queue.add(strRequest); 

这对我有效。它就像JsonObjectRequest一样简单,但是使用String来代替。

+0

它在android 5.1.1上得到错误响应,虽然在android 4.2 – Abhigyan 2015-12-21 10:23:55

+0

上得到错误BasicNetwork.performRequest:意外的响应代码500为 – 2016-05-27 11:15:35

+0

@Joshua C.这节省了我无尽的搜索时间。任何想法为什么JSONObjectRequest不起作用? – sidiabale 2016-07-20 08:02:06

1

使用CustomJsonObjectRequest帮助类提到here

和实施这样的 -

CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() { 
    @Override 
    public void onResponse(JSONObject response) { 
     Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show(); 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show(); 
    } 
}) { 
    @Override 
    protected Map<String, String> getParams() throws AuthFailureError { 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("id", id); 
     params.put("password", password); 
     return params; 
    } 
}; 
VolleySingleton.getInstance().addToRequestQueue(request); 
+0

是的,但为什么JsonObjectRequest也使用JSON来创建HTTP POST请求的主体? 如果一个服务器总是对该主体进行解码以搜索可选的JSON内容,那么该主体通常是以纯文本格式发送的? 令人困惑... – 2016-06-09 09:07:40

27

你必须从你的参数的HashMap做一个JSONObject:

String url = "https://www.youraddress.com/"; 

Map<String, String> params = new HashMap(); 
params.put("first_param", 1); 
params.put("second_param", 2); 

JSONObject parameters = new JSONObject(params); 

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, parameters, new Response.Listener<JSONObject>() { 
    @Override 
    public void onResponse(JSONObject response) { 
     //TODO: handle success 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     error.printStackTrace(); 
     //TODO: handle failure 
    } 
}); 

Volley.newRequestQueue(this).add(jsonRequest); 
+1

正确。这正是我所做的。请看我发布的示例代码。它一开始工作,但突然停止工作。但是,我一直在使用StringRequest作为我的解决方案,并且从此没有任何问题。 – 2015-11-13 04:02:08

+0

我有疑问,这里的方法名称在哪里? – NarendraJi 2016-04-23 08:22:12

+1

这里没有办法,所以你不会看到任何方法的名称:p 这只是一些代码,你可以把你自己的方法;) – Philippe 2017-04-06 16:47:15

5

您可以使用StringRequest做可以wtih JsonObjectRequest同样的事情,同时仍然beeing能够轻松地发送POST参数。你唯一需要做的就是从你得到的请求字符串中创建一个JsonObject,并从那里继续,就像它是JsonObjectRequest一样。

StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         try { 
          //Creating JsonObject from response String 
          JSONObject jsonObject= new JSONObject(response.toString()); 
          //extracting json array from response string 
          JSONArray jsonArray = jsonObject.getJSONArray("arrname"); 
          JSONObject jsonRow = jsonArray.getJSONObject(0); 
          //get value from jsonRow 
          String resultStr = jsonRow.getString("result"); 
         } catch (JSONException e) { 

         } 

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

        } 
       }){ 
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
         Map<String,String> parameters = new HashMap<String,String>(); 
         parameters.put("parameter",param); 

         return parameters; 
        } 

       }; 
       requestQueue.add(stringRequest); 
6

我有类似的问题。但我发现问题不在客户端,而是在服务器端。当您发送一个JSONObject你需要得到Post对象像这样(在服务器端):

在PHP

$ JSON = json_decode(的file_get_contents( 'PHP://输入'),TRUE);

希望这会有所帮助!

+0

解决了我的问题(即使我发现它在别的地方) – 2017-08-03 18:06:38

1

使用的JSONObject对象发送参数表示的参数将是在HTTP POST请求体JSON格式:

Map<String, String> params = new HashMap<String, String>(); 
params.put("tag", "test"); 
params.put("tag2", "test2"); 
JSONObject jsonObj = new JSONObject(params); 

将创建此JSON对象,并将其插入到HTTP POST请求的主体:

{"tag":"test","tag2":"test2"} 

然后,服务器必须解码JSON才能理解这些POST参数。

但通常HTTP POST PARAMATERS是在身体像写:

tag=test&tag2=test2 

但现在这里的问题是,为什么排球这样设置?

读取HTTP POST方法的服务器应该按照标准始终尝试读取JSON中的参数(纯文本除外),因此没有完成的服务器是不好的服务器?

或者相反,HTTP参数在JSON中的POST主体通常不是服务器需要的?

1

可能帮助某人,并节省您一些时间的思考。 我有类似的问题,服务器代码正在寻找Content-Type头。有人做这种方式:

if($request->headers->content_type == 'application/json'){ //Parse JSON... } 

但是抽射被发送这样的标题:

'application/json; charset?utf-8' 

服务器代码更改为这并获得成功:

if(strpos($request->headers->content_type, 'application/json')){ //Parse JSON... 
1

我有类似的问题。但是我发现问题不在服务器端,但问题是关于缓存。您必须清除您的RequestQueue缓存。

RequestQueue requestQueue1 = Volley.newRequestQueue(context); 
requestQueue1.getCache().clear(); 
+0

Turns当你使用默认的缓存实现POST/GET到同一个资源时会发生这种情况,因为它使用url作为它的键。请参阅https://stackoverflow.com/a/26331038/5922516 – enra64 2018-02-11 13:40:24

0

你可以这样来做:

CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() { 

     @Override 
     public void onResponse(JSONObject response) { 
      // Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show(); 

      Log.d("response",""+response.toString()); 

      String status = response.optString("StatusMessage"); 
      String actionstatus = response.optString("ActionStatus"); 
      Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show(); 
      if(actionstatus.equals("Success")) 
      { 
       Intent i = new Intent(SignActivity.this, LoginActivity.class); 
       startActivity(i); 
       finish(); 
      } 
      dismissProgress(); 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show(); 
      Log.d("response",""+error.toString()); 
      dismissProgress(); 
     } 
    }) { 
     @Override 
     public String getBodyContentType() { 
      return "application/x-www-form-urlencoded; charset=UTF-8"; 
     } 

     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("Email", emailval); 
      params.put("PassWord", passwordval); 
      params.put("FirstName", firstnameval); 
      params.put("LastName", lastnameval); 
      params.put("Phone", phoneval); 
      return params; 
     } 

    }; 
    AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG); 

按以下链接 Volley JsonObjectRequest Post request not working

-1

CustomRequest” ......起初,人们为我工作 ....然后所有突然它停止工作,并且我还没有做任何改变到代码“

如果你没有对之前工作的代码做任何改变,那么我建议检查其他参数,如URL,因为如果你使用自己的计算机作为服务器,IP地址可能会改变!

+0

请尝试更好地设置您的问题的格式。例如使用引号。 – guenhter 2017-07-18 13:15:55

0

它确实有效。
我使用这个解析了json对象响应: - 就像一个魅力。

String tag_string_req = "string_req"; 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("user_id","CMD0005"); 

     JSONObject jsonObj = new JSONObject(params); 
String url="" //your link 
     JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, 
       url, jsonObj, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       Log.d("responce", response.toString()); 

       try { 
        // Parsing json object response 
        // response will be a json object 
        String userbalance = response.getString("userbalance"); 
Log.d("userbalance",userbalance); 
        String walletbalance = response.getString("walletbalance"); 
        Log.d("walletbalance",walletbalance); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), 
          "Error: " + e.getMessage(), 
          Toast.LENGTH_LONG).show(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(getApplicationContext(), 
         error.getMessage(), Toast.LENGTH_SHORT).show(); 

      } 
     }); 

     AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req); 

祝你好运! 晚安!