2014-05-25 9 views
6

Sto utilizzando Retrofit per chiamare le API. Sto inviando una richiesta di posta all'API, ma nel callback sto ricevendo JSON vuoto come questo {}.Retrofit: invio di richieste POST al server in Android

Di seguito è il codice per RetrofitService

@POST("/com/searchusers.php") 
void getUser(@Body JSONObject searchstring, Callback<JSONObject> callBack); 

dove searchstring JSON è come questo { "Ricerca": "Nitesh"}. In risposta, dovrei ottenere i dettagli dell'utente "nitesh".

Di seguito si riporta il codice per l'invio di richiesta POST

RetrofitService mRetrofitService = app.getRetrofitService(); 
    mRetrofitService.getUser(user, new Callback<JSONObject>() { 

     @Override 
     public void success(JSONObject result, Response arg1) { 
      System.out.println("success, result: " + result); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      System.out.println("failure, error: " + error); 
     } 
    }); 

sto ottenendo questa uscita successo, risultato: {}

risultato atteso è successo, risultato: { "name": "Nitesh " .... resto dei dettagli}

Edit: ho provato ad utilizzare di risposta, invece di JSONObject come questo CallBack<Response> e poi ho conv ho inserito la prima risposta in String e ho ottenuto il risultato atteso. Ma il problema è relativo a String, voglio la risposta in JSONObject.

Come posso ottenere il risultato esatto utilizzando CallBack<JSONObject> ...?

risposta

8

Dopo aver atteso per la migliore risposta ho pensato di rispondere alla mia domanda. Questo è il modo in cui ho risolto il mio problema.

Ho cambiato il convertitore di RestAdapter di RetrofitService e creato il mio convertitore. Sotto è il mio StringConverter

static class StringConverter implements Converter { 

    @Override 
    public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { 
     String text = null; 
     try { 
      text = fromStream(typedInput.in()); 
     } catch (IOException ignored) {/*NOP*/ } 

     return text; 
    } 

    @Override 
    public TypedOutput toBody(Object o) { 
     return null; 
    } 

    public static String fromStream(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder out = new StringBuilder(); 
     String newLine = System.getProperty("line.separator"); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 
      out.append(newLine); 
     } 
     return out.toString(); 
    } 
} 

Quindi ho impostato questo convertitore sul RestAdapter nella classe Application.

RestAdapter restAdapter = new RestAdapter.Builder() 
     .setEndpoint(BASE_URL) 
     .setConverter(new StringConverter()) 
     .build(); 
    mRetrofitService = restAdapter.create(RetrofitService.class); 

Ora ogni volta che utilizzo Retrofit, ottengo la risposta in String. Quindi ho convertito quello String JSONObject.

RetrofitService mRetrofitService = app.getRetrofitService(); 
mRetrofitService.getUser(user, new Callback<String>() { 

    @Override 
    public void success(String result, Response arg1) { 
     System.out.println("success, result: " + result); 
     JSONObject jsonObject = new JSONObject(result); 
    } 

    @Override 
    public void failure(RetrofitError error) { 
     System.out.println("failure, error: " + error); 
    } 
}); 

Quindi, ho ottenuto il risultato in forma JSON. Quindi ho analizzato questo JSON come richiesto.

+0

mRetrofitService.getUser (utente, nuova richiamata () e il successo public void (String risultato, arg1 Response). In entrambi i JSONObject dovrebbe essere stringa o risultato String dovrebbe essere risultato JSONObject. Ho provato il tuo codice e pensano che questa –

+0

ho corretto il codice per usare 'Callback ' invece di 'Callback '. –

+0

Come possiamo ottenere una stringa nella versione 2.0 di retrofit ??? – astuter

-3

può aiutare a

JSONObject responseJsonObj = new JSONObject(responseString); 
Problemi correlati