2012-10-11 35 views
6

Tengo que hacer una solicitud posterior a un servicio web para autenticar al usuario con nombre de usuario y contraseña.JAVA: http post request

que tienen un problema con petición siguiente mensaje:

public String postTest(String action, ConnectionParametrData [] parameters) { 
     Uri.Builder builder = new Uri.Builder().scheme(scheme).authority(authority).path(action); 
     uri = builder.build(); 
     BufferedReader in = null; 
     String ans = null; 
     HttpPost request = new HttpPost(uri.toString()); 
     HttpClient defaultClient = new DefaultHttpClient(); 
     try { 
      request.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
      request.setEntity(new UrlEncodedFormEntity(getValuePairs(parameters))); 
      HttpResponse response = defaultClient.execute(request); 
      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"), 8192); 
      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String newLine = System.getProperty("line.separator"); 
      while((line = in.readLine()) != null) { 
       sb.append(line + newLine); 
      } 
      ans = sb.toString(); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return ans; 
    } 

Cuando ejecuté este servidor método tiros de error diciendo que la solicitud no es una solicitud posterior.

Pero este método funcione a la perfección:

private String makePost(String action, ConnectionParametrData [] parameters) throws IOException { 
     StringBuilder urlBuild = new StringBuilder(); 
     urlBuild.append(scheme).append("://www.").append(authority).append(action); 
     URL url = new URL(urlBuild.toString()); 
     URLConnection urlConnection = url.openConnection(); 
     urlConnection.setDoInput(true); 
     urlConnection.setDoOutput(true); 
     urlConnection.setUseCaches(false); 
     urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

     DataOutputStream printout = new DataOutputStream(urlConnection.getOutputStream()); 

     String content = getParameters(parameters); 
     printout.writeBytes(content); 
     printout.flush(); 
     printout.close(); 

     BufferedReader in = null; 
     in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()), 8192); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String newLine = System.getProperty("line.separator"); 
     while((line = in.readLine()) != null) { 
      sb.append(line + newLine); 
     } 
     in.close(); 
     return sb.toString(); 
    } 

Yo prefiero usar HttpClient que URLConecction, ¿Alguien sabe por qué primer método no está aprobado como Post?

+1

"throws Error" - en forma de una excepción? ¿Has inspeccionado lo que realmente pasa en la línea (WireShark)? – Fildor

+0

@wilek ¿Se puede imprimir el URI.toString() y publicarlo? –

Respuesta

0

En el primer fragmento de código, no veo dónde está configurando ningún parámetro de entrada para el inicio de sesión y la contraseña.

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair> { 
     new BasicNameValuePair("login", "myusername"), 
     new BasicNameValuePair("password", "somepassword")}; 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Es posible que desee ver en esto: http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient

0

@ James Negro

para el ajuste de parámetros que tengo un método:

private List<NameValuePair> getValuePairs(ConnectionParametrData [] parameters) { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     if(parameters != null) { 
      for (ConnectionParametrData parameter : parameters) { 
       nameValuePairs.add(new BasicNameValuePair(parameter.getKey(), parameter.getValues())); 
      } 
     } 
     return nameValuePairs; 
    } 

@Fildor excepción desde un servidor .

0
public String getPostPage(String postUrl, NameValuePair[] data, 
     String cookie) 
{ 
    String html = ""; 
    PostMethod method = null; 
    String contentStr = null; 
    try 
    { 
     method = new PostMethod(postUrl); 
     method.addRequestHeader("User-Agent", USER_AGENT); 
     method.addRequestHeader("Host", "asqx.moni.gucheng.com"); 
     method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
     method.addRequestHeader("Referer", "..."); 
     method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES); 
     method.addRequestHeader("Cookie", cookie); 
     method.addRequestHeader("X-MicrosoftAjax", "Delta=true"); 
     method.addRequestHeader("Pragma", "no-cache"); 
//   method.addRequestHeader("Accept-Encoding", "gzip, deflate"); 
     method.addRequestHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7"); 
     method.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
     method.addRequestHeader("Accept-Language", "zh-cn,zh;q=0.5"); 
     method.setRequestBody(data); 
     int statusCode = client.executeMethod(method); 

     if(statusCode == HttpStatus.SC_OK) 
     { 
      InputStream in = method.getResponseBodyAsStream(); 
      if (in != null) { 
       byte[] tmp = new byte[4096]; 
       int bytesRead = 0; 
       ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024); 
       while ((bytesRead = in.read(tmp)) != -1) { 
        buffer.write(tmp, 0, bytesRead); 
       } 
       byte[] bt = buffer.toByteArray(); 
       String gbk = new String(bt, "GBK"); 
       String utf8 = new String(bt, "UTF-8"); 
       if (gbk.length() < utf8.length()) { 
        bt = null; 
        bt = gbk.getBytes("UTF-8"); 
        html = new String(bt, "UTF-8"); 
        html = html.replaceFirst(
            "[cC][hH][aA][rR][sS][eE][tT]\\s*?=\\s*?([gG][bB]2312|[gG][bB][kK]|[gG][bB]18030)", 
            "charset=utf-8"); 
       } else if (gbk.length() > utf8.length()) { 
        html = buffer.toString(); 
       } else { 
        html = buffer.toString(); 
       } 
       buffer.close(); 
       contentStr = new String("abc".getBytes(), "UTF-8"); 
       contentStr = html; 

       in.close(); 
       in = null; 
      } 
     } 
     else 
     { 
      contentStr = null; 
     } 
    } catch (Exception e) 
    { 
     log.error(e); 
    } finally 
    { 
     if (method != null) 
      method.releaseConnection(); 
    } 
    return contentStr; 
} 

Uso the mothod para publicar y obtener el contenido devuelto. Hope puede ayudarte.