问题
I am newbie to Json parsing. I am trying to read a json data using JsonArrayRequest
but I am little confused in sending parameters and use POST method.In case of JsonObjectRequest
i can send the method type,url,params but In JsonArrayRequest
how to send params like username and password and use POST method.please help me out.here is the code i have written.
final JsonArrayRequest jsonObjReq = new JsonArrayRequest(MySingleton.getInstance().getDOWNLOAD_SERVICES_URL(), new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
if(response==null) {
pDialog.hide();
}
for (int i = 0; i < response.length(); i++) {
jresponse = response.getJSONObject(i);
}
//String service_response = response.getString("SvcTypeDsc");
Toast.makeText(getActivity().getApplicationContext(), "services" + jresponse, Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
Log.d("soservices", "sos" + e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Login request", "Error: " + error.getMessage());
Log.d("Volley Error:", "Volley Error:" + error.getMessage());
Toast.makeText(getActivity(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show();
pDialog.hide();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("uniquesessiontokenid","39676161-b890-4d10-8c96-7aa3d9724119");
params.put("loginname", userDet.getSAID());
params.put("password", "23295");
return super.getParams();
}
@Override
public int getMethod() {
try {
getParams();
} catch (AuthFailureError authFailureError) {
authFailureError.printStackTrace();
}
return super.getMethod();
}
};
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
}
my json data is like:
{
"username":"rushi",
"firstname": "abc",
},
{
"username": "xyz",
"firstname": "vxa",
},
The params are not being sent. Please help me solving this. Thank you in advance.
回答1:
This solved my problem to pass params when JsonArrayRequest and POST method is used.
Volley.newRequestQueue(getActivity())
.add(new JsonRequest<JSONArray>(Request.Method.POST,
MySingleton.getInstance().getDOWNLOAD_SERVICES_URL(),
jsonobj.toString(),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
Log.d("response", "res-rec is" + jsonArray);
if (jsonArray == null) {
pDialog.dismiss();
Snackbar.make(myview, "No services found", Snackbar.LENGTH_LONG).show();
} else {
for (int i = 0; i < jsonArray.length(); i++) {
try {
pDialog.dismiss();
JSONObject jsonObject = jsonArray.getJSONObject(i);
String desc = jsonObject.getString("SvcTypeDsc");
String image_url = jsonObject.getString("ThumbnailUrl");
// al_ImageUrls.add(image_url);
al_list_of_services.add(desc);
ad_servicesadapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, al_list_of_services);
lv_webservicesList.setAdapter(ad_servicesadapter);
Log.d("imageurls", "imagesurl " + image_url);
Log.d("services-list", "list is " + desc + " " + i);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.d("Login request", "Error: " + volleyError.getMessage());
Log.d("Volley Error:", "Volley Error:" + volleyError.getMessage());
Toast.makeText(getActivity(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show();
pDialog.dismiss();
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
// params.put("uniquesessiontokenid", "39676161-b890-4d10-8c96-7aa3d9724119");
params.put("uniquesessiontokenid", userDet.getSessionToken());
params.put("said", userDet.getSAID());
params.put("SOId", "23295");
return super.getParams();
}
@Override
protected Response<JSONArray> parseNetworkResponse(NetworkResponse networkResponse) {
try {
String jsonString = new String(networkResponse.data,
HttpHeaderParser
.parseCharset(networkResponse.headers));
return Response.success(new JSONArray(jsonString),
HttpHeaderParser
.parseCacheHeaders(networkResponse));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
// return null;
}
}
);
回答2:
import java.io.UnsupportedEncodingException;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
public class CustomRequest extends Request<JSONObject> {
private Listener<JSONObject> listener;
private Map<String, String> params;
public CustomRequest(String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
};
@Override
protected Response<JSONObject> 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));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
}
In activity/fragment do use this
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
requestQueue.add(jsObjRequest);
Answer get form here. https://stackoverflow.com/a/19945676/1641556
Refer these articles also.
- https://developer.android.com/training/volley/index.html
- http://www.androidhive.info/2014/09/android-json-parsing-using-volley/
回答3:
If you are using 'com.android.volley:volley:1.0.0'
you should override getParams()
method like this:
public synchronized void addJsonArrayRequest(int method, String url, final JSONObject jsonRequest, Response.Listener<JSONArray> responseListener, Response.ErrorListener errorListener) {
JsonArrayRequest request = new JsonArrayRequest(method, url, null, responseListener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> params = new HashMap<>();
try {
params.put("key1", jsonRequest.getString("key1"));
params.put("key2", Integer.toString(jsonRequest.getInt("key2")));
params.put("key3", Boolean.toString(jsonRequest.getBoolean("key3")));
params.put("key4", jsonRequest.getJSONArray("key4").toString());
} catch (JSONException e) {
e.printStackTrace();
}
return params;
}
};
addToRequestQueue(request);
}
If you are using 'com.mcxiaoke.volley:library:1.0.19' you can simply put JSONObject
:
public synchronized void addJsonArrayRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONArray> responseListener, Response.ErrorListener errorListener) {
JsonArrayRequest request = new JsonArrayRequest(method, url, jsonRequest, responseListener, errorListener);
addToRequestQueue(request);
}
回答4:
here is an example to post the request to the server using volly
You can add the parameters to a HashMap and then pass that into the request you are creating;
EDITED:
HashMap<String, String> mRequestParams = new HashMap<String, String>();
mRequestParams.put("username","abcd");
mRequestParams.put("password", "123456");
public void vollyStringRequestForPost() {
JsonArrayRequest req = new JsonArrayRequest(Request.Method.POST, strURL, new JSONObject(mRequestParams),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
//Here you will receive your response
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Do what you want to do on error
}
});
mRequestQueue.add(req);
}
}
回答5:
Here you go..
final HashMap<String, String> params = new HashMap<String, String>();
params.put("email", userName);
params.put("password", password);
final JSONObject jsonObject = new JSONObject(params);
JsonArrayRequest req = new JsonArrayRequest(Request.Method.POST, url, jsonObject,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
//process response
}
catch(JSONEXception e){}
And on PHP side you can get these params like this
$json=file_get_contents('php://input');
$data = json_decode($json);
$email=$data->{'email'};
$pass=$data->{'password'};
来源:https://stackoverflow.com/questions/33014210/how-to-post-request-parameters-when-using-jsonarrayrequest-in-volley