2012-09-15 17 views
12

Estoy tratando de implementar una simple publicación JSON en la URL que acepta JSON en el cuerpo con autenticación básica en ANDROID.Android - HttpClient JSON POST con autenticación básica

He intentado con HttpUrlConnection pero me "desautorizaron" y mis datos se envían al servidor.

Otra forma que probé es usar HttpClient, pero ahora me sale un problema diferente. La autenticación funciona perfectamente pero los datos no se envían al servidor ...

Solo para estar seguro, configuré una pequeña prueba en un simple proyecto de Java (no en el entorno de Android).

Este es el código que estoy usando a POST al servidor:

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); 

El código en el proyecto Java funciona perfecto.

Cuando intento exactamente el mismo código en Android, recibo internal server error del servidor, lo que significa que los datos JSON no se han recibido.

Realmente no entiendo por qué esto funciona en JAVA pero no en Android.

El efecto que me gustaría lograr, es el siguiente 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/ 

Respuesta

0

creo que no se debe utilizar localhost en el URL

+0

Gracias por su respuesta, que se acaba de ilustrar en este código "localhost", en realidad, yo uso la ruta completa del dominio. – user1674948

+0

Desde su punto de vista, ¿es esta la forma correcta de hacer la publicación del cuerpo de JSON en el servidor? Tal vez es solo un emulador que no funciona? – user1674948

+0

Tu código es correcto. Si está probando en Emulator, use la dirección IP 10.0.2.2 en su lugar. Consulte http://developer.android.com/tools/devices/emulator.html#networkaddresses. – secondflying

2

Finalmente, todo se arregló. Cualquier persona que pueda experimentar este problema siguiente es la solución.

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

Este Base64.encodeToString anexa un extra "\ n" al final de la cadena de autorización. Luego, en el siguiente línea del servidor después de que el carácter "\ n" se trate como el cuerpo de la solicitud y, por supuesto, incorrecto.

Mediante la sustitución de todas las nuevas líneas en cadena de la autorización va a resolver el problema:

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

solución fácil pero difícil de encontrar ;-)

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

...

La solución es un poco más simple:

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

¡genial, funciona! – marchinram

+0

Tuve que agregar '" "+ authorizationString +" "' para que funcione (la solicitud HTTP no era válida) –

+0

Ahora es 'Base64.getEncoder(). EncodeToString (...' – Bohemian

2

Creo que la forma más sencilla es:

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