JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
Const.URL_LOGIN, null,
new Response.Listener<JSONObject>() {
Does the above code send JSON Object to a particular URL?
Ok, the JSONObject class from Volley, normally has two conditions:
the third param is the json you want to send.
If you use:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
Const.URL_LOGIN, null,
new Response.Listener<JSONObject>() {
}
.
.
.
You you are using the first constructor, that means you want to send some object in your body request, and if you send null, volley in the constructor do this param.toString(), so if you send null, imagine, null.toString(), obviously will crash, that is not possible operation of a null object.
So the other option is to use the second constructor:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
Const.URL_LOGIN,
new Response.Listener<JSONObject>() {
}
.
.
.
You dont have to send the third param (the param/json body), so this constructor auatomatically has the condition that you dont want to send nothing to the server. I think you have to use the second constructor, otherwise could fail.
Regards.
Related
I am writing a simple JSONArrayRequest. This is my JSONArrayRequest:
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
});
I'm confused on why we set the jsonRequest parameter in JsonArrayRequest to null. The only docs I found was this: https://developer.android.com/training/volley/request, which didn't really explain much. If somebody could explain this, I would really appreciate it. Thank you.
As the documentation says, the parameters of JsonArrayRequest are:
method - the HTTP method to use
url - URL to fetch the JSON from
jsonRequest - A JSONArray to post with the request. Null indicates no parameters will be posted along with request
listener - Listener to receive the JSON response
errorListener - Error listener, or null to ignore errors
So the null value you're passing is for the parameters to post along with the request, which can be null if you have nothing to pass.
jsonRequest as the name suggests json in request means something as payload you want to pass onto the server.
GET: is the type of HTTP method used for getting some info from the server and in that case we usually don't have to pass any payload to the server hence the jsonRequest is null in that case means the body will be empty in your API request.
POST/PUT: is the type of HTTP method used for creating/updating info on the server and in that case we have to pass any payload to server hence the jsonRequest is non-null in that case means the body will be the json data which we will pass as jsonRequest in your API request.
Update:
jsonRequest is of type JSONArray in JsonArrayRequest, so you can just convert your arraylist into jsonarray and pass it on.
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
list.add("CodingChap");
JSONArray jsonArray = new JSONArray(list);
I am using volley library. I have the following API url http://example.com/project/contriller/ and need to post the json request as body {"function":"getList","parameters":{"latitude":"10.0086575","longitude":"76.3187739"},"token":""}to it.
How can send it using Volley?
Please check below two options for that.
Option1
Try to send data in Map variable as below, and put this code just above you are calling request using Post as below.
Map<String, String> postParam= new HashMap<String, String>();
postParam.put("function", "getList");
postParam.put("latitude", "10.0086575");
postParam.put("token", "");
new JsonObjectRequest(url, postParam, new Response.Listener<JSONObject>() { ... });
option2
You can use below to send direct JSON.
final JSONObject jsonData = new JSONObject("{\"function\":\"getList\",\"parameters\":{\"latitude\":\"10.0086575\",\"longitude\":\"76.3187739\"},\"token\":\"\"}");
new JsonObjectRequest(url, jsonData, new Response.Listener<JSONObject>() { ... });
I am using Volley JsonObjectRequest to get data from server.
code snippet:
JsonObjectRequest jsObjRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
System.out.println("Response: " + response.toString());
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
But I am getting same JSONObject response every time on mobile data connection.
Note: It's work perfectly on WiFi connection.
Is anyone facing this issue ? any solution ?
#BNK request.setShouldCache(false); worked for me. It's issue of volley cache management.
I assume that, when a request is sent:
It would hit the cache first and send that to onResponse
then when the results come through from the remote server it would provide it to the onResponse
If you use any of the default Request classes implemented in volley(e.g. StringRequest, JsonRequest, etc.), then call setShouldCache(false) right before adding the request object to the volley RequestQueue
request.setShouldCache(false);
myQueue.add(request);
You can also set expiration policy for cache.
See this answer for more details
Im using volley library in my project and i need to use post method it turns out i have to use a custom request class so i did but in my activity some methods cannot be resolved like this.createRequestSuccessListener(), this.createRequestErrorListener();
here is my code
enter code here
String register_url = "xxxxxxx";
RequestQueue requestQueue = Volley.newRequestQueue(MyActivity.this);
CustomRequest jsObjRequest = new CustomRequest(Request.Method.POST, register_url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
requestQueue.add(jsObjRequest);
how can this be resolved any help would be appreciated .
I am doing an update on the old project & I don't have much knowledge of Android as of now. In project we have Comments section on product.
For comment after sending earlier we had return as 0 (some error) & 1 (success).
Below is the code we were using.
final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Method.POST,
act.getString(R.string.CommentForUserURL),
null, new Response.Listener<JSONObject>() {
#Override
public void onResponse(
JSONObject response) {
Log.d("response done", "done===" + response);
mloading.setVisibility(View.GONE);
if (response != null) {
Comment obj = new Comment();
JSONObject jsonObject = response;
try {
obj.setComment(jsonObject
.getString("Comment"));
Now we have changed the return object from 0/1 to user object.
Does this need need to update JsonObjectRequest to GJSON request? Or object will also get parsed with JsonObjectRequest?
I am asking because when I execute above, I get error as below.
01-25 12:30:21.754: E/Volley(16487): [10114] BasicNetwork.performRequest:
Unexpected response code 500 for
http://new.souqalharim.com/add/CommentForMerchant
Any idea why I am getting this error?
Note: This URL is working fine for iPhone application.
Edit 1
This is post method, so full url is not there. There are few more parameters to add like ?comment=MyComment&userId=123&productId=234. As it is post I am not adding parameters in actual url.
I have those in another methods
#Override
protected Map<String, String> getParams()
throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("productId", productId.toString());
params.put("userId",
mSessionManager.getUserCode().toString());
params.put("comment", GlobalFunctions
.EncodeParameter(med_comments
.getText().toString()));
return params;
}
Full url is as below.
http://new.souqalharim.com/add/CommentForUser?productId=325&userId=5&comment=abcd
I tested this in Mozilla RESTClient and it works fine.
Edit 2
After checking further I found protected Map<String, String> getParams() throws AuthFailureError { is not getting called. Any idea why this is happening?
The problem is below.
final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Method.POST,
act.getString(R.string.CommentForUserURL),
null, new Response.Listener<JSONObject>() {
^^^^
It should be
final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Method.POST,
act.getString(R.string.CommentForUserURL),
new JSONObject(params), new Response.Listener<JSONObject>() {
^^^^^^^^^^^^^^^^^^^^^^
Copy code from protected Map<String, String> getParams() before final JsonObjectRequest.
That's it!!!
Reason is as below.
The JsonObjectRequest is extended JsonRequest which override getBody() method directly, so your getParam() would never invoke, I recommend you extend StringRequest instead of JsonObjectRequest.
your can check this answer for more details.
Actually 500 means Internal server error and this is caused by the Rest-api you are calling and not due to Volley,so check the back-end code.
BasicNetwork.performRequest: Unexpected response code 500
The server receives the correct response, but detects an error, this error is due to the PHP connection file with the database, this code must have the function implemented to hide the values of the query to avoid sql insertion
use this sample code:
<?php
$con = new mysqli('localhost', 'u648230499_wololo', '*********', 'u648230899_ejexample');
if ($con->connect_error) {
echo 'error connect database: ', $con->connect_error;
exit();
}
$participantId = $_POST['participantId'];
$name = $_POST['name'];
$sql = $con->prepare('INSERT INTO participant VALUES (?,?)');
$sql->bind_param('is', $participantId, $name);
$sql->execute();
echo 'OK\n';
$con->close();
?>