Autore Topic: Problema nel passaggio die parametri usando la libreria volley  (Letto 417 volte)

Offline DanielAndroid

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Oneplus 2
  • Sistema operativo:
    Windows 10 / Mac OS X
Problema nel passaggio die parametri usando la libreria volley
« il: 30 Novembre 2015, 14:06:36 CET »
0
Ciao a tutti, vi spiego il mio problema, sto aggiornando il mio codice dalle vecchie librerie (quelle che usavano httpClient ecc..) alle nuove (volley), ho un problema però, io devo passare in input al mio script php un certo id, dal quale ricavo l'informazione che mi serve che restituirò come oggetto json.
Il problema è che sembra che al server non arrivi nulla, cioè il tag di successo è sempre 0, però se io scrivo dentro al mio file php hardcoded un certo id, il tutto funziona correttamente.
Vi posto il codice dei miei due file:
Codice (Java): [Seleziona]
private void makeJsonObjectRequest() {



    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            Config.url_info, null, new Response.Listener<JSONObject>() {

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

            try {
                int success = response.getInt(TAG_SUCCESS);
                if(success == 1) {
                    // successfully received details
                    JSONArray infoObj = response.getJSONArray(TAG_INFO); // JSON Array

                    // get first course object from JSON Array
                    info = infoObj.getJSONObject(0);
                    showResult();

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


        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("VOLLEY ERROR: ", "Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_SHORT).show();


        }
    }){
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String,String> params = new HashMap<>();
        //Adding parameters to request
        params.put("id", id);
        //returning parameter
        return params;
    }
};

    // Adding request to request queue
    //AppController.getInstance().addToRequestQueue(jsonObjReq);
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(jsonObjReq);
}

Qui invece il mio file php:
Codice (PHP): [Seleziona]
<?php

// array for JSON response
$response = array();

// include db connect class
require_once __DIR__ . '/db_connect.php';
//include query class
require_once __DIR__ . '/query.php';

// connecting to db
$db = new DB_CONNECT();

// check for post data

if (isset($_GET["id"])) {
    $id = $_GET['id'];

    // get a product from products table
    $result = $db ->sth -> query("SELECT * FROM info WHERE id = $id");

    if (!empty($result)) {
      // check for empty result
      if (mysqli_num_rows($result) > 0) {

        $result = mysqli_fetch_array($result);
        $dett = array();
        $dett["where"] = $result["where"];
        $dett["when"] = $result["when"];
        $dett["cost"] = $result["cost"];
        $dett["link"] = $result["link"];

        // success
        $response["success"] = 1;

        // user node
        $response["info"] = array();

        array_push($response["info"], $dett);

        // echoing JSON response
        echo json_encode($response);
    } else {
        // no product found
        $response["success"] = 0;
        $response["message"] = "No course found";

        // echo no users JSON
        echo json_encode($response);
    }
} else {
    // no product found
    $response["success"] = 0;
    $response["message"] = "No course found";

    // echo no users JSON
    echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";

// echoing JSON response
echo json_encode($response);
}
Ho postato la domanda anche su stackoverflow, però non ho ricevuto nessuna risposta, vi posto il link nel caso  in cui la voleste vedere: php - Android volley library, method return null object - Stack Overflow

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Problema nel passaggio die parametri usando la libreria volley
« Risposta #1 il: 30 Novembre 2015, 14:37:06 CET »
0
Non conosco la libreria. Ma su stackoverflow molti parlano del JsonObjectRequest che non prende i parametri. Io comunque uso asynkhttp e funziona bene.

Offline DanielAndroid

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Oneplus 2
  • Sistema operativo:
    Windows 10 / Mac OS X
Re:Problema nel passaggio die parametri usando la libreria volley
« Risposta #2 il: 07 Dicembre 2015, 14:34:16 CET »
0
Non conosco la libreria. Ma su stackoverflow molti parlano del JsonObjectRequest che non prende i parametri. Io comunque uso asynkhttp e funziona bene.

Ho provato in tutti i modi a risolvere però non c'è stato niente da fare, sto usando una guida che mi ha proposto questo codice:
Codice (Java): [Seleziona]
public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
               
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
               
                // request method is GET

                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();



        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

sto provando ad agiornarle con le nuove librerie però non funziona, per farlo funzionare basta sostituire:
Codice (Java): [Seleziona]
if(method == "POST"){
                // request method is POST
                // defaultHttpClient
               
                URL urlConnect = new URL (url);
                HttpURLConnection conn = (HttpURLConnection) urlConnect.openConnection();
                conn.setRequestMethod("POST");
                conn.setReadTimeout(15000);
                conn.setConnectTimeout(15000);
                conn.setDoInput(true);
                conn.setDoOutput(true);
                in = httpConn.getInputStream();
             

            }else if(method == "GET"){
               
                URL urlConnect = new URL (url);
                HttpURLConnection conn = (HttpURLConnection) urlConnect.openConnection();
                conn.setRequestMethod("GET");
                conn.setReadTimeout(15000);
                conn.setConnectTimeout(15000);
                conn.setDoInput(true);
                conn.setDoOutput(true);
               in = httpConn.getInputStream();
oppure devo fare altre modifiche?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Problema nel passaggio die parametri usando la libreria volley
« Risposta #3 il: 07 Dicembre 2015, 16:58:43 CET »
0
Una libreria è un codice java che ti permette di fare x righe in y righe. Dove y e minore di x. Quindi volley e le altre servono per semplificare il codice. Quello che hai postato tu sono le api native di android. E volley e le altre integrano proprio quelle. E lo fanno alla perfezione. In ogni caso una qualsiasi libreria è più facile rispetto a scrivere tutto il codice (ammesso che sia fatta bene).
Ora se non funziona come tu vuoi sbagli sicuramente tu nel utilizzo. Se non ti trovi allora cambia libreria. Prova okhttp. Puoi incontrare dei bug. Allora è giusto che aprì un issue nella pagina github di tale libreria.