Volley – 使用JSONArrayRequest发送POST请求

我正在使用Volley与API进行交互。 我需要发送一个post请求(带参数)到一个返回JSON数组的服务。

JsonObjectRequest有一个构造函数,它接受一个方法和一组参数

JsonObjectRequest(int method, java.lang.String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) 

然而,JSONArrayRequest(我需要的)只有一个forms的构造函数

 JsonArrayRequest(java.lang.String url, Response.Listener<JSONArray> listener, Response.ErrorListener errorListener) 

我怎样才能使这个数据发送POST请求?

他们可能会在稍后添加它,但同时你可以自己添加想要的构造函数:

 public JsonArrayRequest(int method, String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } 

这没有经过testing,虽然我看不出有什么理由不应该工作,因为实现细节在超类: JsonRequest

尝试一下,看看它是否工作。

编辑:

我叫它! 在我回答这个问题差不多两年之后,Volley团队在2015年3月19日将这个build造者join了回购。 你猜怎么了? 这是EXACT语法。

我很懒,没有自己build立Volley库(只使用.jar),因此没有源代码…所以在匿名新的JSONArrayRequest我添加了这些函数:

  // NO CONSTRUCTOR AVAILABLE FOR POST AND PARAMS FOR JSONARRAY! // overridden the necessary functions for this @Override public byte[] getBody() { try { return paramsArray.toString().getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } @Override public int getMethod() { return Method.POST; } 

这段代码将使你想要的

  Volley.newRequestQueue(context).add( new JsonRequest<JSONArray>(Request.Method.POST, "url/", null, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("param1", "one"); params.put("param2", "two"); return params; } @Override protected Response<JSONArray> parseNetworkResponse( NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser .parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser .parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } }); 

使用JSONarray Request根据参数发送参数请求并返回自定义响应的最简单的方法是在URL本身中添加参数值。

 String URL ="http://mentormentee.gear.host/android_api/Message.aspx?key="+keyvalue; 

其中keyvalue参数值和在JsonArrayRequest URL中简单添加这个URL。

  JsonArrayRequest searchMsg= new JsonArrayRequest(URL, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); // Parsing json for (int i = 0; i < response.length(); i++) { try { JSONObject obj = response.getJSONObject(i); Message msg = new Message(); msg.setMessageThread(obj.getString("msgThread")); msg.setUserName(obj.getString("Username")); msg.setDate(obj.getString("msgDate")); // adding movie to movies array MessageList.add(msg); } catch (JSONException e) { e.printStackTrace(); } } // notifying list adapter about data changes // so that it renders the list view with updated data adapter.notifyDataSetChanged(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hidePDialog(); } }); // Adding request to request queue AppController.getInstance().addToRequestQueue(searchMsg); } 
 You can use this package HelperClass; /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; import com.android.volley.toolbox.JsonRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.util.Map; /** * A request for retrieving a {@link JSONArray} response body at a given URL.enter code here */ public class MyjsonPostRequest extends JsonRequest<JSONArray> { protected static final String PROTOCOL_CHARSET = "utf-8"; /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param requestBody A {@link String} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, String requestBody, Listener<JSONArray> listener, ErrorListener errorListener) { super(method, url, requestBody, listener, errorListener); } /** * Creates a new request. * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener) { super(Method.GET, url, null, listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, Listener<JSONArray> listener, ErrorListener errorListener) { super(method, url, null, listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param jsonRequest A {@link JSONArray} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, JSONArray jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } /** * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is * <code>null</code>, <code>POST</code> otherwise. * * @see #MyjsonPostRequest(int, String, JSONArray, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONArray jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } /** * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is * <code>null</code>, <code>POST</code> otherwise. * * @see #MyjsonPostRequest(int, String, JSONObject, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } @Override protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } } 

可能是你的问题解决了,但我希望这将有助于其他用户。 我所做的是,我创build了一个新的自定义类扩展它..这里是代码。

 public class CustomJsonRequest extends Request { Map<String, String> params; private Response.Listener listener; public CustomJsonRequest(int requestMethod, String url, Map<String, String> params, Response.Listener responseListener, Response.ErrorListener errorListener) { super(requestMethod, url, errorListener); this.params = params; this.listener = responseListener; } @Override protected void deliverResponse(Object response) { listener.onResponse(response); } @Override public Map<String, String> getParams() throws AuthFailureError { return params; } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } } 

您可以使用此类而不是JsonArrayRequest或JSonObjectRequest。 而且这也解决了php不能在$ _POST中捕获post参数的问题

只需添加一些关于JsonArrayRequest的细节。 在\ src \ com \ android \ volley \ toolbox中,可以发现JsonArrayRequest的默认构造不支持Method参数,并且在构造中添加了方法(GET),所以如果你想使用其他方法,请自己写

 public class JsonArrayRequest extends JsonRequest<JSONArray> { /** * Creates a new request. * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public JsonArrayRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener) { super(Method.GET, url, null, listener, errorListener); } 
 List<Map<String,String>> listMap = new ArrayList<Map<String, String>>(); Map<String,String> map = new HashMap<String,String>(); try { map.put("email", customer.getEmail()); map.put("password",customer.getPassword()); } catch (Exception e) { e.printStackTrace(); } listMap.add(map); String url = PersonalConstants.BASE_URL+"/url"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.POST, url, String.valueOf(new JSONArray(listMap)), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { Log.d(App.TAG, jsonObject.toString()); } }, new Response.ErrorListener (){ @Override public void onErrorResponse(VolleyError volleyError) { Log.d(App.TAG,volleyError.toString()); } } ); App.getInstance().getmRequestQueue().add(jsonObjectRequest); 
 JsonArrayRequest req = new JsonArrayRequest(urlJsonArry, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); try { // Parsing json array response // loop through each json object jsonResponse = ""; for (int i = 0; i < response.length(); i++) { JSONObject person = (JSONObject) response .get(i); String name = person.getString("name"); String email = person.getString("email"); JSONObject phone = person .getJSONObject("phone"); String home = phone.getString("home"); String mobile = phone.getString("mobile"); jsonResponse += "Name: " + name + "\n\n"; jsonResponse += "Email: " + email + "\n\n"; jsonResponse += "Home: " + home + "\n\n"; jsonResponse += "Mobile: " + mobile + "\n\n\n"; } txtResponse.setText(jsonResponse); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } hidepDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); hidepDialog(); } }); // Adding request to request queue AppController.getInstance().addToRequestQueue(req); 

}