2013-07-04 6 views
7

Sto provando a inviare un POST a un server utilizzando il loopj async http library. Il seguente codice è piuttosto standard ma non riesco a farlo funzionare.AsyncHttpRequest POST che non attiva i callback (android-async-http di loopj)

ho debug un po 'e controllare la seguente:

  • L'URL è corretto.
  • I parametri sono corretti e sono memorizzati correttamente nella variabile params.

Sembra che quando HttpResponse response = client.execute(request, context); è chiamato in AsyncHttpRequest.makeRequest() la richiesta non contiene alcun params:

EDIT: Dopo aver guardato il codice un po 'di più a quanto pare potrebbe essere inclusi nel params POST entità o gruppo di testa.

enter image description here

Ma il vero problema è che non ho ricevuto nessuno dei callback (vedi codice qui sotto). L'istruzione if dopo la chiamata client.execute() non viene mai chiamata (il punto di interruzione non viene attivato).

RequestParams params = new RequestParams(); 
params.put("loginid", "user"); 
params.put("password", "pass"); 
params.put("deviceid", "deviceid"); 

AsyncHttpClient client = new AsyncHttpClient(); 
client.post(MDSettings.BASE_URL + "/user/login", params, new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     Log.d(MDSettings.TAG, "MDConnectionManager - login - response: " + response); 
     singleton.connectionSuccessful(response, returnIndex); 
    } 

    @Override 
    public void onFailure(Throwable error, String content) { 
     Log.d(MDSettings.TAG, "MDConnectionManager - login - content: " + content); 
     singleton.connectionFailed("Login Failed", error.getMessage(), returnIndex); 
    } 
}); 

Sto usando questa libreria perché mi consente di inviare file di cui ho bisogno in seguito in questo progetto. Se c'è un'altra lib che fa la stessa cosa (e in effetti funziona), per me andrebbe bene.

La mia domanda è: perché non ricevo alcun callback e come posso risolvere questo problema? Dimmi quando qualcosa non è chiaro e cercherò di spiegarlo in modo più approfondito.

+0

è possibile discutere alcuni riguardo questo file utente/login ?? –

+0

Cosa vuoi sapere? Non penso che sia necessario vedere altro, poiché non vedo il messaggio 'Log.d()' che significa che i callback 'onSuccess()' e 'onFailure()' non vengono chiamati. – Manuel

+0

solo perché qualche tempo non è stata generata una risposta json a causa di parametri non validi, quindi vi chiedo. basta andare avanti con il codice di servizio ancora una volta :) –

risposta

3

Sembra che il mio ingresso android.permission.INTERNET è stato rimosso dal file manifesto. Dopo averlo aggiunto di nuovo, tutto ha funzionato come previsto. Ogni volta che qualcosa non funziona controllerò le mie autorizzazioni.

+0

grazie, torno ad Android dopo un anno e dimentico questo permesso :) –

0

Beh, non so nulla di questa libreria, ma perché non provare a creare qualcosa di simile ad essa, utilizzando AsyncTasks? Ad esempio puoi sottoclasse AsyncTask e fornirgli l'URL che vuoi caricare. Un altro modo è di sottocludere AsyncTask e fornirgli un oggetto Callable. Questo approccio ti consentirà di generalizzare questa classe rendendola adatta a svolgere diverse attività a lungo termine, non solo le richieste di rete. Entrambi i metodi possono utilizzare alcune interfacce con i callback (onSuccess, onFailure). E in onPostExecuteMethod è possibile determinare se c'è stato un errore durante l'esecuzione dell'attività o meno e fornire callback neede.

+0

Se avessi solo bisogno di fare un POST normale, avrei fatto esattamente quello che hai detto, ma in una fase successiva del progetto ho bisogno di inviare anche file (piuttosto grandi). Mi piacerebbe usare una libreria per questo se possibile. – Manuel

0

qui nel codice si chiama direttamente il metodo responsehanlder dal post. prima:

client.post(MDSettings.BASE_URL + "/user/login", params, responseHandler); 

nella riga successiva Just Add metodo get

client.get(MDSettings.BASE_URL + "/user/login", new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(String response) { 
      System.out.println(response); 
     } 
    }); 

poi u otterrà risposta da esso

+0

Ho bisogno di ottenere la risposta dal POST, non dal GET (che mi darà un errore XML). – Manuel

1

Prova questo semplice snippet.

Questo funziona sul mio dispositivo.

Esso stampa "Errore", come non è consentito POST (stato HTTP: 405)

AsyncHttpClient client = new AsyncHttpClient(); 
RequestParams params = new RequestParams(); 
params.put("q", "google"); 

client.post("http://google.com", params, new AsyncHttpResponseHandler(){ 
    public void onSuccess(String arg0) { 
     Log.d("TAG", "Success");   
    };          

    public void onFailure(Throwable arg0, String arg1) { 
     Log.d("TAG", "Failure");   
    }; 
}); 
+0

Ho provato questo codice e non fa nulla (proprio come il mio codice). Sembra quasi che non riesca a collegarmi a Internet. – Manuel

+0

Ho scelto questa risposta per la taglia perché mi ha aiutato a trovare il problema (nessuna connessione internet a causa di una voce di autorizzazioni rimossa). – Manuel