Get JSONArray with StringRequest from Android - java

I am trying to get hold of a JSONArray by using StringRequest in Android along with the POST-method.
The php-script is written like:
$statement = mysqli_prepare($con, "SELECT * FROM tickets WHERE user_id > 5 AND completed = 1");
mysqli_stmt_bind_param($statement, "i", $UID);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $user_id, $beacon_id, $timeFrom, $timeTo, $completed);
$jsonObject = array();
$response = array();
while($status = mysqli_stmt_fetch($statement)){
$jsonObject = null;
$jsonObject["beacon_id"]= $beacon_id;
$jsonObject["timeFrom"]= $timeFrom;
$jsonObject["timeTo"]= $timeTo;
$response[] = $jsonObject;
}
echo json_encode($response);?>
Accessing the web-page with the php-script, the following JSONArray is "echoed":
[{"beacon_id":10,"timeFrom":"2018-02-14 13:07:11","timeTo":"2018-02-14 14:32:53"},{"beacon_id":3,"timeFrom":"2018-02-24 13:33:37","timeTo":"2018-02-24 13:33:47"}]
And as I understand this is a normal JSONArray with square-brackets representing the array and curly-brackets for each JSONObject inside the array.
When I try to access this JSONArray through a StringRequest in Android Studio (Java), I do not get any results...
The StringRequest code:
public class HistoryRequest extends StringRequest {
private static final String HISTORY_REQUEST_URL = "http://myURL.../myPHPfile.php";
private Map<String, String> params;
public HistoryRequest(String user_id, String instanceID, Response.Listener<String> listener) {
super(Method.POST, HISTORY_REQUEST_URL, listener, null);
params = new HashMap<>();
params.put("user_id", user_id);
params.put("instanceID", instanceID);
}
#Override
public Map<String, String> getParams() {return params;}
}
The ResponseListener in the MainActivity is written like:
Response.Listener<String> responseListener = new Response.Listener<String>() {
#Override
public void onResponse(String response) {
JSONArray jsonArray = new JSONArray(response);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String timeFrom = jsonObject.getString("timeFrom");
String timeTo = jsonObject.getString("timeTo");
textviewFrom.append(timeFrom);
textviewTo.append(timeTo);
}
}
};
Any tips why I can't make a JSONArray of the String that in the web-page URL looks like a beautiful JSONArray?
Thanks in advance!
UPDATE:
After switching to JSONArrayRequest instead of StringRequest, I can get the data if I change the MySQL part of the php-script to something static like:
SELECT * FROM tickets;
Then I can display all the entries. But I tend to send 1 parameter to the server (user_id), so that I can filter the entries based on the user that is logged in. [SELECT * FROM tickets where user_id = ?], like a traditional POST-method....
Someone who knows what to do? Read several places that you can not #Override the getParams()-method for this...
SOLVED:
I solved the issue by entering the keyvalue (user_id) into the URL.
//Instead of POST:
$user_id = $_POST["user_id"];
// I use SERVER to get the value after ? in the URL:
$user_id = $_SERVER['QUERY_STRING'];
Doing this with the following java-code:
public class HistoryRequest extends JsonArrayRequest {
private static final String HISTORY_REQUEST_URL = "http://myURLorIPaddress/getHistory.php?";
public HistoryRequest(String UID, Response.Listener<JSONArray> listener) throws JSONException {
super(Method.POST, HISTORY_REQUEST_URL + UID,null, listener, null);
}
}
This made it possible to filter the result based on user_id and works like a charm :D

I do not get to print anything, but I can see that the Volley library is complaining for some external errors (nothing referred to my code). The log.i("OnResponseLog", response) does not provide anything.
Picture of error from LogCat:

I am working in similar project did you check if there are some null entries? I think the problem might be there by checking your LogCat picture.
Check using isNull() function might be good idea.
https://processing.org/reference/JSONObject_isNull_.html

Related

How to fix NetworkUtility.shouldRetryException: Unexpected response code 404

i am using gofile link but when i call it i get this error
E/Volley: [4463] NetworkUtility.shouldRetryException: Unexpected response code 404 for https://api.gofile.io/getFolder?folderId=XuxRGg
i also attach the code part
public class GoFile {
public interface goFileCallback {
void onSuccess(String result);
void onError(VolleyError error);
}
public static void getStreamLink(Context context, String url, final goFileCallback callback) {
String[] parts = url.split("/");
String id = parts[4];
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest sr = new StringRequest(com.android.volley.Request.Method.GET, "https://api.gofile.io/getFolder?folderId="+id, response -> {
JsonObject jsonObject = new Gson().fromJson(response, JsonObject.class);
JsonObject data = jsonObject.get("data").getAsJsonObject();
JsonObject contents = data.get("contents").getAsJsonObject();
for (String keyStr : contents.keySet()) {
JsonObject md5 = contents.get(keyStr).getAsJsonObject();
String link = md5.get("link").getAsString();
callback.onSuccess(link);
}
}, error -> callback.onError(error));
queue.add(sr);
}
}
i would be glad if some one help me to solve this
You should double check the link "https://api.gofile.io/getFolder?folderId=XuxRGg". Typing it in chrome also return 404.
say 404_Not Found response code -
check api link and find http_response_code(404)(in php) - probably there isn't response in database

How can I send Push Notifications using Device tokens in Android programmatically (FCM) (JAVA)

Not able to send push notifications to specific users using device tokens.
How can I send push notifications using only device-tokens to specific user obtained from FirebaseMessaging in android. I actually want to notify users whether their tickets are verified or rejected , here is my code please and help me out please,
private void sendNotificationRequest(String title, String message,String deviceToken) throws JSONException {
JSONObject mainObject = new JSONObject();
mainObject.put("to","/"+deviceToken);
JSONObject notificationDataObject = new JSONObject();
notificationDataObject.put("title",title);
notificationDataObject.put("body",message);
mainObject.put("notification",notificationDataObject);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, POST_BASE_URL,
mainObject,
response -> {
}, error -> {
}
)
{
#Override
public Map<String, String> getHeaders() {
Map<String, String> header = new HashMap<>();
header.put("content-type","application/json");
header.put("authorization","key="+SERVER_KEY);
return header;
}
};
requestQueue.add(jsonObjectRequest);
}

Next Page Token is not functional and display only maximum (50) results

I am trying to fetch all videos of a channel using youtube data api, but my code is giving error and doesn't respond to PAGE token
displayVideos();
}
private void displayVideos ()
{
RequestQueue requestQueue= Volley.newRequestQueue(this);
StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
System.out.println(jsonObject.get("nextPageToken"));
JSONArray jsonArray = jsonObject.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
if (jsonObject1.has("id")){
JSONObject jsonVideoId=jsonObject1.getJSONObject("id");
if (jsonVideoId.has("kind")){
if(jsonVideoId.getString("kind").equals("youtube#video")){
JSONObject jsonObjectSnippet = jsonObject1.getJSONObject("snippet");
JSONObject jsonObjectDefault=jsonObjectSnippet.getJSONObject("thumbnails").getJSONObject("medium");
String video_id=jsonVideoId.getString("videoId");
VideoDetails vd=new VideoDetails();
vd.setVideoId(video_id);
vd.setTitle(jsonObjectSnippet.getString("title"));
vd.setDescription(jsonObjectSnippet.getString("description"));
vd.setUrl(jsonObjectDefault.getString("url"));
videoDetailsoArrayList.add(vd);
}
// recyclerView.setAdapter(adapter);
// adapter.notifyDataSetChanged();
}
}
}
}catch (JSONException e) {
e.printStackTrace();
}
the url I am trying to parse is
String url="https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCVMWWQ985A_-SESZUy_SsVQ&maxResults=50&pageToken="+nextPageToken+"&order=date&pageToken=CAUQAA&key=API_KEY";
I have been searchingb to apply nextpage token or page token in android studio but couldnt get specific tutorial. there are many examples but being naive in android studio I cant implement it into my code.
Please note that your URL does contain two instances of the parameter pageToken:
"https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCVMWWQ985A_-SESZUy_SsVQ&maxResults=50&pageToken="+nextPageToken+"&order=date&pageToken=CAUQAA&key=API_KEY".
It should have only one for that to work OK; to be more precise, your URL should contain only this instance: pageToken="+nextPageToken+".
On the other hand, your code above does not show the loop implementing pagination. That is that you haven't shown the piece of code where you actually assign a valid value to the variable nextPageToken.
Therefore I cannot tell if your program will work or not.
The pagination loop would look like this:
// initially no pageToken
nextPageToken = null;
// URL as above, without the parameter pageToken
url = ...
do {
invoke the API on the URL: url + (nextPageToken != null ? "&pageToken=" + nextPageToken : "")
nextPageToken = jsonObject.get("nextPageToken");
} while (nextPageToken != null)

PHP-array to Java Arraylist using Volley

I am trying to convert a PHP-array into a Java ArrayList.
I have this PHP-Code which seems to have no syntax errors:
$password = "xxxx";
$host = "localhost";
$db_name = "xxxx";
$output = array();
$con = mysqli_connect("$host", "$user", "$password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
if (!mysqli_select_db($con, $db_name)) {
die('Could not select database: ');
}
$result = mysqli_query($con, "SELECT name FROM shopping_items"); //change to "name"
if (!$result) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
while($row = mysqli_fetch_array($result, MYSQLI_BOTH))
{
$output[]=$row;
}
return $output;
mysqli_close($con);
?>
It takes one row from the table, so I should get back a PHP-array.
Now comes the hard part. In Java, I wrote the following code using the Volley library:
public void getShopping(String url) {
//init queue or get from somewhere
RequestQueue queue = Volley.newRequestQueue(this);
StringRequest stringRequest;
stringRequest = new StringRequest(Request.Method.GET, url, //URL leads to PHP-File
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
shoppingItems.add(response); //shopping Items is an ArrayList
adapter.notifyDataSetChanged();
Toast.makeText(ShoppingListActivity.this, response, Toast.LENGTH_SHORT);
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
//got error
}
});
queue.add(stringRequest);
}
I want to have each item added to shoppingItems. But when printing the array out I get an empty string. I think that StringRequest is the wrong way to go but I don't know any other way. I read that using json_encode is possible but that seems unnecessarily complicated to me. Is there an easier way to do that?
I could not find an answer in previous SO questions. If at all possible, please provide help that involves Volley because it is pretty integrated in my code.

org.json.JSONException: End of input at character 0 of

There is some issue with the JSONObjectRequest in Volley library to receive the JSON data. I suppose I am going wrong somewhere in receiving the JSON object in the Java code. Following is my JSON output coming as a response from the php file hosted on server:
{"workers":[
{"id":"1","name":"Raja","phonenumber":"66589952","occupation":"Plumber","location":"Salunke Vihar","rating":"4","Review":"Hard Worker","price":"80"},
{"id":"2","name":"Aman","phonenumber":"789456","occupation":"Plumber","location":"Wakad","rating":"4","Review":"Good","price":"80"}
],
"success":1}
Following is clode from the Java file where I am using the JSON request using Volley library:
JsonObjectRequest jsonRequest = new JsonObjectRequest (Request.Method.POST, url,
new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
// I should receive the success value 1 here
int success = response.getInt("success");
//and should receive the workers array here
Log.d("response",response.getJSONArray("workers").toString());
Log.d("success",""+success);
} catch (JSONException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
//Finally initializing our adapter
adapter = new WorkerAdapter(listWorkers);
recyclerView.setAdapter(adapter);
//adapter is working fine
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Log.d("error",error.toString());
Toast.makeText(getApplicationContext(),error.toString(),Toast.LENGTH_LONG).show();
}
}){
#Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("tag", "get_list");
params.put("service", service);
return params;
}
Running the above code it goes to the error listener and gives the output as org.json.JSONException: End of input at character 0 of.
But if I use StringRequest in place of JsonObjectRequest and receive the JSON response as a string then I am able to receive the output as a String but I can't use it further. So, please let me know where I am going wrong in receiving the JSONdata and suggest me the changes in the code that I must do.
EDIT- I am adding the php file which is returning the JSON object. Please let me know if there is some error over here:
<?php
error_reporting(0);
include("config.php");
if($_SERVER['REQUEST_METHOD']=='POST'){
$tag = $_POST['tag'];
// array for JSON response
$response = array();
if ($tag == 'get_list') {
// Request type is check Login
$service = $_POST['service'];
//echo json_encode($service);
// get all items from myorder table
$result = mysql_query("SELECT * FROM Workers WHERE Occupation = '$service'") or die(mysql_error());
if (mysql_num_rows($result) > 0) {
$response["workers"] = array();
while ($row = mysql_fetch_array($result)) {
// temp user array
$item = array();
$item["id"] = $row["wID"];
$item["pic"] = $row["Pic"];
$item["name"] = $row["Name"];
$item["phonenumber"] = $row["Phone Number"];
$item["occupation"] = $row["Occupation"];
$item["location"] = $row["Location"];
$item["rating"] = $row["Rating"];
$item["Review"] = $row["Review"];
$item["price"] = $row["Price"];
// push ordered items into response array
array_push($response["workers"], $item);
}
// success
$response["success"] = 1;
}
else {
// order is empty
$response["success"] = 0;
$response["message"] = "No Items Found";
}
}
echo json_encode($response);
}
?>
When I ran the api end point I have got the following result instead of the one that you have been telling so. So stop giving irrelevant data.
"Plumber"{"workers":[{"id":"1","pic":"ttp:\/\/vorkal.com\/images\/vorkal_cover.PNG","name":"Raja","phonenumber":"66589952","occupation":"Plumber","location":"Salunke Vihar","rating":"4","Review":"Hard Worker. Very Professional.","price":"80"},{"id":"2","pic":"http:\/\/vorkal.com\/images\/vorkal_cover.PNG","name":"Aman","phonenumber":"789456","occupation":"Plumber","location":"Wakad","rating":"4","Review":"Good","price":"80"}],"success":1}
Where Plumber is not the tag at all, hence throws error as the same is not valid json string. There's error in your server side scripting. I request you to send the complete script without modification.
If you are not getting the JSONObject that means the following is a malformed json. Thus you can try the following code in server side
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = $this->utf8ize($v);
}
} else if (is_string ($d)) {
return utf8_encode($d);
}
return $d;
}
where$d is the string/response. use it as echo json_encode($this->utf8ize($detail));
Also try the following in client side code
Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
You may refer the solution to this question here click here
you can use Gson to convert json string to object
Gson gson = new Gson();
GetWorkersResponse getWorkersResponse =gson.fromJson(response,GetWorkersResponse.class);
class GetWorkersResponse {
public boolean success;
public List<Worker> workers = new ArryList<>();
}
It's work for me.
Can you check that server is returning you a JSONObject and not the string? In Volley if the type of response is different then it will return the error.

Categories

Resources