2012-09-15 18 views
12

Sto cercando di implementare un semplice post JSON sull'URL che accetta JSON nel corpo con autenticazione di base su ANDROID.Android - HttpClient JSON POST con autenticazione di base

Ho provato con HttpUrlConnection ma ottengo "non autorizzato" e i miei dati vengono inviati al server.

Un altro modo in cui ho provato è utilizzare HttpClient, ma ora ho un altro problema. L'autenticazione funziona perfettamente ma i dati non vengono inviati al server ...

Solo per sicurezza, ho impostato un piccolo test in un semplice progetto Java (non Android Environment).

Questo è il codice che sto usando POST al server:

DefaultHttpClient httpClient = new DefaultHttpClient(); 
ResponseHandler<String> resonseHandler = new BasicResponseHandler(); 
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");  
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}")); 
postMethod.setHeader("Content-Type", "application/json"); 
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 
String response = httpClient.execute(postMethod,resonseHandler); 
System.out.println("response :" + response); 

Il codice nel progetto Java funziona perfettamente.

Quando provo esattamente lo stesso codice in Android, ottengo internal server error dal server, il che significa che i dati JSON non sono stati ricevuti.

Realmente non capisco perché questo funzioni in JAVA ma non in Android.

L'effetto che vorrei realizzare, è il seguente comando:

curl --dump-header - -H "Content-Type: application/json" -X 
POST --data '{"amount_adult":1, "object_id":13}' 
--user travelbuddy:travelbuddy http://localhost/api/v1/purchase/ 

risposta

0

Penso che non si dovrebbe usare localhost nell'URL

+0

Grazie per la risposta, ho appena illustrato in questo codice "localhost", in realtà, io uso il percorso completo del dominio. – user1674948

+0

Dal tuo punto di vista, questo è il modo corretto di fare il post del corpo JSON sul server? Forse è solo un emulatore che non funziona? – user1674948

+0

Il tuo codice è giusto. Se si esegue il test in Emulator, utilizzare invece l'indirizzo IP 10.0.2.2. Consulta http://developer.android.com/tools/devices/emulator.html#networkaddresses. – secondflying

2

Infine, tutto è ordinato. Qualunque persona possa provare questo problema in seguito è la soluzione.

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 

Questa Base64.encodeToString aggiunge un extra "\ n" alla fine della stringa di autorizzazione. Quindi sulla riga successiva del server dopo "\ n" il carattere viene trattato come corpo della richiesta e, naturalmente, errato.

Sostituendo tutte le nuove linee nella stringa di autorizzazione risolverà il problema:

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
authorizationString.replace("\n", ""); 
    postMethod.setHeader("Authorization", authorizationString); 

soluzione semplice ma difficile da trovare ;-)

26
String authorizationString = "Basic " + Base64.encodeToString(
    ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
    Base64.DEFAULT); 

...

La soluzione è un po 'più semplice in realtà:

String authorizationString = "Basic " + Base64.encodeToString(
     ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
     Base64.NO_WRAP); // <=== Do not add '\n' 
+1

cool, funziona! – marchinram

+0

Ho dovuto aggiungere "" "+ authorizationString +" "' per farlo funzionare (la richiesta HTTP non era valida.) –

+0

Ora è 'Base64.getEncoder(). EncodeToString (...' – Bohemian

2

Penso che il modo più semplice è:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false)); 
Problemi correlati