JAVA: richiesta post http

Devo inviare una richiesta a un servizio web per autenticare l’utente con nome utente e password.

Ho un problema con la seguente richiesta di post:

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

Quando eseguo questo metodo, il server genera un errore che dice che la richiesta non è una richiesta di posta.

Ma questo metodo funziona perfettamente:

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

Preferisco usare HttpClient di URLConecction, qualcuno sa perché il primo metodo non è approvato come POST?

Nel tuo primo frammento di codice, non vedo dove stai impostando alcun parametro di post per login e password.

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

Potresti voler dare un’occhiata a questo: http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient

@James Black

per l’impostazione del parametro I ho un metodo:

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

@Fildor Exception viene generata dal server.

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

Io uso la maledizione per pubblicare e ottenere il contenuto di ritorno. La speranza può aiutarti.