2011-05-11 14 views
10

Necesito crear una solicitud HTTP POST con parámetros. Sé que hay muchos ejemplos, he intentado usar HTTPparams, NameValuePair, etc. pero no puedo obtener el formato correcto para el servidor.Android: publicación de Http con parámetros que no funcionan

Server Type: REST based API utilizing JSON for data transfer
Content-type: application/json
Accept: application/json
Content-length: 47
{"username":"abcd","password":"1234"}

que pueden pasar estas cabeceras pero me parece que no puede pasar estos parametros "nombre de usuario", "contraseña". Aquí está mi código:

HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://www.mymi5.net/API/auth/login"); 
    List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
    pairs.add(new BasicNameValuePair("username","abcd")); 
    pairs.add(new BasicNameValuePair("password","1234")); 
    post.setHeader("Content-type", "application/json"); 
    post.setHeader("Accept", "application/json"); 
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,"UTF-8"); 
    post.setEntity(entity); 
    HttpResponse response = client.execute(post); 

Me trataron de depuración, pero no puede ver si la entidad está conectado correctamente o no ... ¿Qué estoy haciendo mal?

Gracias de antemano. Maaz

Respuesta

15

Prueba esto:

HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://www.mymi5.net/API/auth/login"); 
    post.setHeader("Content-type", "application/json"); 
    post.setHeader("Accept", "application/json"); 
JSONObject obj = new JSONObject(); 
obj.put("username", "abcd"); 
obj.put("password", "1234"); 
    post.setEntity(new StringEntity(obj.toString(), "UTF-8")); 
    HttpResponse response = client.execute(post); 
+0

Justo lo que necesitaba! Muchas gracias. :) – Maaz

+3

perfecto - para agregar, me gusta usar la constante definida: 'HTTP.UTF_8' –

+0

¿Por qué funciona esto y el código del OP no? Me enfrenta a un problema similar, pero solo en 1 de cada 10 servidores. –

1

No estoy muy seguro, desde su descripción, pero parecería que el servidor espera un objeto de contenido JSON en lugar de los datos que se codifica en la URL. Enviar algo así como el cuerpo de su mensaje:

{"username":"abcd","password":"1234"} 
+1

Gracias Dmon, el código de Femis funcionó bien. pero incluso su sugerencia me hubiera llevado al código correcto :) – Maaz

1
HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost("http://www.mymi5.net/API/auth/login"); 
List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 

pairs.add(new BasicNameValuePair("username","abcd")); 
pairs.add(new BasicNameValuePair("password","1234")); 

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,HTTP.UTF_8); 
post.setEntity(entity); 
HttpResponse response = client.execute(post); 

Intenta esto coz funciona perfecto para mí cuando estoy intentando escribir un mensaje HTTP.

+0

Gracias Sumant, lo intenté en un momento pero no funcionó. :( – Maaz

1

esto probablemente funcione para usted.

suponiendo que ya tiene el objeto json.

NOTA: (1) en el servidor necesita manejar la solicitud como utf-8 (también en la base de datos).

@SuppressWarnings("unchecked") 
private static HttpResponse executePostRequest(JSONObject jsonData, String url) { 
    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httpost = new HttpPost(url); 

    try { 
     httpost.setEntity(new ByteArrayEntity(jsonData.toString().getBytes("UTF8"))); 
     httpost.setHeader("Accept", "application/json"); 
     httpost.setHeader("Content-type", "application/json;charset=UTF-8"); 
     httpost.setHeader("Accept-Charset", "utf-8"); 
     HttpResponse httpResponse = httpclient.execute(httpost); 
     return httpResponse; 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 

entonces en el cliente manejar la respuesta del servidor como esto:

String responseBody = EntityUtils 
        .toString(response.getEntity(), "UTF-8"); 
Cuestiones relacionadas