Autore Topic: POST JSON GET  (Letto 163 volte)

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
POST JSON GET
« il: 15 Novembre 2016, 16:15:48 CET »
0
Salve ragazzi sono sempre io che vi chiedo umilmente aiuto...
in pratica mi sto "sbizzarrendo" a fare chiamate al WS con GET, se nonchè oggi mi sono imbattuto in un POST... e qui mi sono completamente bloccato...quello che so è che la procedura è differente, bensì i dati non vanno inseriti come in una GET ma diversamente..quello che volevo chiedervi infatti è proprio questo.. mi sapreste spiegare o far vedere qualche esempio di come posso risolvere questo problema?
al momento ho :
Codice: [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnHit = (Button) findViewById(R.id.btnHit);
        tvData = (TextView) findViewById(R.id.tvJsonItem);
        btnHit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new JSONTask().execute("http:... //qui metto il mio url"); (che di base è un POST ma io lo sto gestendo come un get quindi credo sia totalmente sbagliato il tutto)
            }
        });
    }

    private class JSONTask extends AsyncTask<String, String, String> {
        private TextView Data;

        @Override
        protected String doInBackground(String... params) {

            HttpURLConnection connection = null;
            BufferedReader reader = null;

            try {
                URL url = new URL (params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod(POST);
                connection.connect();

                InputStream stream = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(stream));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);

                }
                String stringadalWS = buffer.toString();
                JSONObject jso = new JSONObject(stringadalWS);
                JSONArray array = jso.getJSONArray("recipe");

                    recipe = new ArrayList<Recipe>();
                for (int i = 0; i < array.length(); i++) {
                    Recipe myRecipe = new Recipe(array.getJSONObject(i));
                    recipe.add(myRecipe);
                }
                return buffer.toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            tvData.setText(result);
        }

    }
}
sapreste aiutarmi? ho una classe Recipe dove ho preso ogni singolo valore...

Codice: [Seleziona]
public class Recipe {
    int id,preparation_time,difficult;
    String title,image;
    ArrayList<Recipe> categories;

    public Recipe(JSONObject jsonObject){
        try{
            this.id = jsonObject.optInt("id");
            this.title = jsonObject.optString("title");
            this.image = jsonObject.optString("image");
            this.preparation_time = jsonObject.optInt("preparation_time");
            this.difficult = jsonObject.optInt("difficult");

            this.categories = new ArrayList<Recipe>();
            JSONArray recipeArray = jsonObject.optJSONArray("categories");

            for (int i = 0; i<recipeArray.length();i++){
                Recipe recipe = new Recipe(recipeArray.getJSONObject(i));
                this.categories.add(recipe);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public Recipe(int id) {
        this.id = id;
    }

    public ArrayList<Recipe> getCategories() {
        return categories;
    }

    public void setCategories(ArrayList<Recipe> categories) {
        this.categories = categories;
    }

    public int getDifficult() {
        return difficult;
    }

    public void setDifficult(int difficult) {
        this.difficult = difficult;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public int getPreparation_time() {
        return preparation_time;
    }

    public void setPreparation_time(int preparation_time) {
        this.preparation_time = preparation_time;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
Grazie in anticipo :)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:POST JSON GET
« Risposta #1 il: 15 Novembre 2016, 16:45:00 CET »
0
Prova così:


Codice (Java): [Seleziona]
URL url = new URL (params[0]);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000); //10 secondi di timeout in ricezione
conn.setConnectTimeout(15000); //15 secondi di timeout in invio
conn.setRequestMethod("POST"); //Dichiari l'uso di POST
conn.setDoInput(true); //Dichiari l'intenzione di leggere dati
conn.setDoOutput(true); //Dichiari l'intenzione di scrivere dati

//Prepari i parametri da inviare via POST
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("firstParam", paramValue1));
params.add(new BasicNameValuePair("secondParam", paramValue2));
params.add(new BasicNameValuePair("thirdParam", paramValue3));

//Apri lo stream per preparare i dati POST all'invio
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8"));

//Prepari i dati della richiesta codificandoli
writer.write(getQuery(params));
writer.flush();
writer.close();
os.close(); //Dati POST pronti

//Esegui la connessione
conn.connect();
//...


Codice (Java): [Seleziona]
//Codifica i dati per la richiesta POST
private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    String sep = "";

    for (NameValuePair pair : params) {
        result.append(sep);
        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
        sep = "&";
    }

    return result.toString();
}

Fonte: http://stackoverflow.com/a/13486223/466938
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:POST JSON GET
« Risposta #2 il: 15 Novembre 2016, 17:08:43 CET »
0
Grazie mille ohmni è la giusta strada da percorrere, ma nel mio caso specifico, dovrei crearmi un arraylist di Recipe o soltanto di pararm non riesco a seguire bene.. potresti indirizzarmi verso il mio esempio? ho messo un po di tutto nel post precedente...sempre se non ti disturbo..

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:POST JSON GET
« Risposta #3 il: 15 Novembre 2016, 17:32:37 CET »
0
Beh non è chiaro che cosa devi fare.

Solitamente si inviano dei parametri di una richiesta (via POST o via GET o tutti e due) per ricevere un dato in risposta.

Da quello che posso desumere tu invii dei parametri via GET (ossia nell'URL) e leggi la risposta restituita.

Se vuoi fare la richiesta via POST, i parametri che normalmente passeresti nell'URL della richiesta devi passarli come nell'esempio ("firstParam", "secondparam", ecc.)
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:POST JSON GET
« Risposta #4 il: 15 Novembre 2016, 17:47:24 CET »
0
ok adesso mi trovo in questa situazione :
 
Codice: [Seleziona]
URL url = new URL ("http://bitdrome-dev.com/projects/algida/backend/web/?r=app/recipe/allrecipes");
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                connection.setRequestMethod(POST);
                conn.setDoInput(true);
                conn.setDoOutput(true);

                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("page_number","20")
                        .appendQueryParameter("page", "0");
                String query = builder.build().getEncodedQuery();

                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();
                conn.connect();

                InputStream stream = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(stream));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);

                }
il problema che quando vado a startare mi da questo errore:
java.net.MalformedURLException: Protocol not found: bitdrome-dev.com/projects/algida/backend/web/?r=app/recipe/allrecipes
W/System.err:     at java.net.URL.<init>(URL.java:176)
W/System.err:     at java.net.URL.<init>(URL.java:125)
W/System.err:     at com.example.nicola.ricetteesapori.MainActivity$JSONTask.doInBackground(MainActivity.java:64)

qualche idea?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:POST JSON GET
« Risposta #5 il: 15 Novembre 2016, 21:18:21 CET »
0

Prova a mettere tutto dentro un try { ... } catch (IOException) { ... }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:POST JSON GET
« Risposta #6 il: 16 Novembre 2016, 10:15:41 CET »
0
ok il grosso del lavoro è fatto, ora mi manca soltanto di chiamarmi ogni singolo oggetto contenuto nell'Array recipe nel mio caso, e  il problema è che siccome è un POST non so dove farlo...