Autore Topic: Passare parametri multipli con invocazione a un metodo remoto in Json  (Letto 1878 volte)

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Devo inviare un oggetto json con questa forma esatta di sintassi

Codice: [Seleziona]
{"method":"startSession","params":"["email" "testmail@test.it", "password" "1234", "stayLogged" "1", "idClient" "ANDROID"]"}
i tutorial che ho trovato vanno bene solo se il json ha la classica forma solo parametri senza altri blocchi d'invocazione a un metodo remoto purtroppo,

c'è qualche developer in gamba che saprebbe dirmi come fare??

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #1 il: 01 Marzo 2012, 23:04:18 CET »
0
il json è un formato per contenere dei dati, in questo caso tu hai un json con due parametri:
1 - Chiave=method , Valore=startSession
2 - Chiave=params , Valore =["email" "testmail@test.it", "password" "1234", "stayLogged" "1", "idClient" "ANDROID"]
l'errore ti compare perchè hai gli apici " dentro il json. Prova a metterli con il backslash ( \" ) e vedrai che va
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #2 il: 01 Marzo 2012, 23:55:38 CET »
0
Il problema è che non so come fargli inviare la giusta sintassi

il mio codice è
Codice: [Seleziona]
JSONObject json = new JSONObject();

            String email="testmail@test.it";
            String emailRic="email"+" "+"\""+email+"\"";
            String password="1234";
            String passwordRic="password"+" "+"\""+password+"\"";
            String stayLogged="1";
            String stayLoggedRic="stayLogged"+" "+"\""+stayLogged+"\"";
            String idClient="ANDROID";
            String idClientRic="idClient"+" "+"\""+idClient+"\"";

            try {
                List<String> accessParameters=new ArrayList<String>();
                accessParameters.add(emailRic);
                accessParameters.add(passwordRic);
                accessParameters.add(stayLoggedRic);
                accessParameters.add(idClientRic);
                String par=accessParameters.toString();

                json.put("method", "startSession");
                json.put("params", par);                 

                JSONArray postjson=new JSONArray();
                postjson.put(json);
                httppost.setHeader("json",json.toString());
                httppost.getParams().setParameter("jsonpost",postjson);
                System.out.print(json);
                HttpResponse response = mClient.execute(httppost);

                if(response != null){
                    InputStream is = response.getEntity().getContent();

                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder();
                    System.out.println("the answer is:\n"+sb);
                    String line = null;

                try {
                        while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
               // text = sb.toString();
                }
               // tv.setText(text);

            }catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            }


e mi invia
Codice: [Seleziona]
{"method":"startSession","params":"[\"email\" \"testmail@test.it\", \"password\" \"1234\", \"restaConnesso\" \"1\", \"idClient\" \"IPHONE\"]"}

se provo a rimuovere i caratteri \" dal pezzo di codice


Codice: [Seleziona]
String email="testmail@test.it";
            String emailRic="email"+" "+"\""+email+"\"";
            String password="1234";
            String passwordRic="password"+" "+"\""+password+"\"";
            String stayLogged="1";
            String stayLoggedRic="stayLogged"+" "+"\""+stayLogged+"\"";
            String idClient="ANDROID";
            String idClientRic="idClient"+" "+"\""+idClient+"\"";



mi invia la stringa

Codice: [Seleziona]
{"method":"startSession","params":"[email testmail@test.it, password 1234, restaConnesso 1, idClient IPHONE]"}
che è comunque errata


Dovrebbe essere una cosa semplice ma non ho ben capito come gestire json quando ci sono parametri annidati come in questo caso.

Dove il json da inviare è
Codice: [Seleziona]
   {"method":"startSession",
    "params": { "email": "testmail@test.it",
                "password": "1234",
                "stayLogged": "1",
                "idClient": "IPHONE"
               }
   }
« Ultima modifica: 01 Marzo 2012, 23:57:14 CET da AndreaF »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #3 il: 02 Marzo 2012, 09:01:40 CET »
0
...
Dove il json da inviare è
Codice: [Seleziona]
   {"method":"startSession",
    "params": { "email": "testmail@test.it",
                "password": "1234",
                "stayLogged": "1",
                "idClient": "IPHONE"
               }
   }

ahh ecco, ora stiamo parlando di json!
questo è un json object con due chiavi:
1- method
2-params
method è una stringa, "startSession"
params è un jsonobject con a sua volta 4 chiavi:
1- Chiave=email , Valore=testmail@test.it
2- Chiave=password , Valore=1234
3- Chiave=stayLogged , Valore=1
4- Chiave=idClient , Valore=IPHONE

 
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #4 il: 02 Marzo 2012, 10:22:29 CET »
0
ahh ecco, ora stiamo parlando di json!
questo è un json object con due chiavi:
1- method
2-params
method è una stringa, "startSession"
params è un jsonobject con a sua volta 4 chiavi:
1- Chiave=email , Valore=testmail@test.it
2- Chiave=password , Valore=1234
3- Chiave=stayLogged , Valore=1
4- Chiave=idClient , Valore=IPHONE


Questo lo so,
solo che non so la sintassi corretta da utilizzare, visto che il codice che ho utilizzato mi genera un json errato :'(

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #5 il: 02 Marzo 2012, 14:10:08 CET »
0
se ti scrivo il codice non impari! devi provare a prendere il json corretto che mi hai messo, metterlo in una stringa e fare new JSONObject(Stringa).
in debug ti vai a vedere come è fatta la struttura, cosi capisci! senno alla prossima struttura siamo punto e a capo
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #6 il: 02 Marzo 2012, 17:14:58 CET »
0
se ti scrivo il codice non impari! devi provare a prendere il json corretto che mi hai messo, metterlo in una stringa e fare new JSONObject(Stringa).
in debug ti vai a vedere come è fatta la struttura, cosi capisci! senno alla prossima struttura siamo punto e a capo

anche vedendo il codice si impara... comunque ho corretto il problema (in parte)


è una cosa normale che però le variabili se le ordina a modo suo???

mi spiego:

a prescindere da che ordine uso per fare la put dei parametri

Codice: [Seleziona]
json.put("email", email);
json.put("password", password);
json.put("StayLogged", ok);
jsonParametri.put("idClient", idClient);

nel Json finale spedito al server le varie coppie non sono nello stesso ordine,
(del tipo che per esempio mi trovo la coppia idClient e la coppia Password prima della coppia email ecc.)

la cosa può influire sul corretto funzionamento durante un passaggio json per una chiamata RPC  oppure l'importante è che siano mantenute le associazioni chiave-valore??
« Ultima modifica: 02 Marzo 2012, 17:17:39 CET da AndreaF »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #7 il: 02 Marzo 2012, 18:24:18 CET »
0
se la struttura è corretta,l'ordine non ha importanza. Se sei in dubbio copia qui la versione che dici sia "disordinata" che controlliamo se è corretta!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #8 il: 04 Marzo 2012, 13:50:55 CET »
0
se la struttura è corretta,l'ordine non ha importanza. Se sei in dubbio copia qui la versione che dici sia "disordinata" che controlliamo se è corretta!

purtroppo ho visto che la stringa deve essere per foza

Codice: [Seleziona]
{"method":"startSession","params":["email" "testmail@test.it", "password" "1234", "restaConnesso" "1", "idClient" "IPHONE"], "id": 1}
dove il valore di params è un array ordinato, me l'ha confermato l'admin del sito...

ho provato tante volte cercato tutorial ma non riesco a mantenere la stessa identica struttura

non c'è un modo di inviare magari la stringa intera come JSON??


come posso fare?? :(
« Ultima modifica: 04 Marzo 2012, 14:00:52 CET da AndreaF »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #9 il: 04 Marzo 2012, 18:51:46 CET »
0
la stringa che tu hai copiato non è un json corretto,l'array non è ben formattato
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #10 il: 04 Marzo 2012, 20:26:02 CET »
0
la stringa che tu hai copiato non è un json corretto,l'array non è ben formattato


L'admin del sito mi ha detto, copia\incolla che ha questa forma:

Codice: [Seleziona]
{"method":"startSession", "params":["", "email@email.com", "password", "1", "IPHONE"], "id":1}


Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #11 il: 04 Marzo 2012, 22:35:18 CET »
0

L'admin del sito mi ha detto, copia\incolla che ha questa forma:

Codice: [Seleziona]
{"method":"startSession", "params":["", "email@email.com", "password", "1", "IPHONE"], "id":1}
questo è tutt'altro che quello che hai scritto prima! una virgola ogni stringa è ok, una virgola ogni due stringhe no!
in questo caso params è un JSONArray, basta che lo riempi come se fosse un'array normale, mettendo i valori in ordine
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #12 il: 05 Marzo 2012, 02:27:46 CET »
0
questo è tutt'altro che quello che hai scritto prima! una virgola ogni stringa è ok, una virgola ogni due stringhe no!
in questo caso params è un JSONArray, basta che lo riempi come se fosse un'array normale, mettendo i valori in ordine

Vero,

comunque se provo a inviare un json in quella forma con il codice

Codice: [Seleziona]
String email="prova@email.it";
String password="1234";
String stayLogged="1";
String idClient="IPHONE";

JSONArray parametri=new JSONArray();
parametri.put("");
parametri.put(email);
parametri.put(password);
parametri.put(stayLogged);
parametri.put(idClient);
                                   
JSONObject oggettojson = new JSONObject();
oggettojson.put("method", "startSession");
oggettojson.put("params", parametri);
oggettojson.put("id", 1);

il println

Codice: [Seleziona]
String ogj =oggettojson.toString();
System.out.println(ogj);

mi porta un json uguale a quello che ho postato e che dovrebbe funzionare,
ma ricevo sempre un errore 500 dal server :'(

poi cosa strana mi restituisce una pagina html... cosa che mi fa supporre che non riconosce proprio l'httpost come una chiamata tpc
« Ultima modifica: 05 Marzo 2012, 11:57:35 CET da AndreaF »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #13 il: 05 Marzo 2012, 18:54:08 CET »
0
è piu probabile che sbagli ad inviargli il contenuto nella chiamata HTTP...
io tempo fa feci un'app per l'università, che inviava il json nel body

Codice (Java): [Seleziona]
DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new StringEntity(JSONData));
            httppost.setHeader("Accept", "application/json");          
            httppost.setHeader("Content-type", "application/json");
            HttpResponse response = (HttpResponse) httpclient.execute(httppost);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//fai quell che vuoi in caso di risposta 200 OK
            } else throw new IllegalAccessException("Risposta errata");
JSONDATA è la String presa dal json
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline AndreaF

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
Re:Passare parametri multipli con invocazione a un metodo remoto in Json
« Risposta #14 il: 06 Marzo 2012, 02:28:09 CET »
0
si hai ragione ho controllato e c'era un errore sull'impostazione dell'header.



Problema risolto grazie del supporto.... che stress il lavoro di sviluppatore :)