2012-03-31 49 views
2

所以我有這段代碼,我得到它的工作,現在它基本上允許我發送http post並獲取我想要的幾乎任何外部網站的請求,除非這些元素不包含name屬性。這裏有一個例子:發送HTTP請求GET/POST以形成Java?

這是Java代碼:

public static String sendPostRequest(String url) { 

    StringBuffer sb = null; 

    try { 

     String data = URLEncoder.encode("user", "UTF-8") + "=" 
       + URLEncoder.encode("myUserName", "UTF-8") + "&" 
       + URLEncoder.encode("submit", "UTF-8") + "=" 
       + URLEncoder.encode("Submit", "UTF-8"); 


     URL requestUrl = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection) requestUrl 
       .openConnection(); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("GET"); 

     OutputStreamWriter osw = new OutputStreamWriter(
       conn.getOutputStream()); 
     osw.write(data); 
     osw.flush(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(
       conn.getInputStream())); 

     String in = ""; 
     sb = new StringBuffer(); 

     while ((in = br.readLine()) != null) { 
      sb.append(in + "\n"); 
     } 

     osw.close(); 
     br.close(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

這是我想要的請求發送到形式(這是在W3Schools的網站形式,這是該網站http://www.w3schools.com/html/html_forms.asp):

<form name="input0" target="_blank" action="html_form_action.asp" method="get"> 

Username: 

<input type="text" name="user" size="20" /> 

<input type="submit" value="Submit" /> 

</form> 

現在因爲提交按鈕不具有name屬性,我無法發送正確的HTTP GET/POST請求,它(我知道這是在這種情況下,get方法)。我用什麼方法(什麼正確的鍵/值)替換字符串數據,以便它實際發送請求到這個表單?

回答

1

我使用HttpClient的生成HTTP請求

HttpClient的是開源的Apache項目。你可以獲得廣泛的代碼。 的HttpClient 4.1版是不錯的集HTTP API

HttpClient Learning Artical

+0

這是如何在相對於什麼,我試圖做什麼辦法?我在問什麼鍵/值應該用來發送HTTP POST請求到特定的站點...不是關於某種API – ZimZim 2012-03-31 10:03:56

+0

@ user1007059:HttpClient會給你更好的可讀性,你可以解決你的問題...我在我的項目中使用這個httpclien 4.1,並從任何URL獲取數據。 – 2012-03-31 10:35:40

1

你不的submit部件添加到您的任何數據。這只是讓瀏覽器知道「提交」按鈕會觸發該操作。請注意,新打開的網站的網址如何顯示:http://www.w3schools.com/html/html_form_action.asp?user=myUserName - 沒有submit部分。所以,你的data代碼應該是這樣的:

String data = URLEncoder.encode("user", "UTF-8") + "=" 
      + URLEncoder.encode("myUserName", "UTF-8"); // end here 
+0

埃姆,不工作,無論我在html_form_action.asp網站或html_forms.asp網站上使用它。我已經嘗試了與其他網站,它不工作,除非我添加提交按鈕的一部分... – ZimZim 2012-03-31 10:02:03

+0

這可能是因爲當你調用'getOutputStream()時,'GET'請求被'POST'自動替換, '。這是一件合理的事情,因爲通常這就是作者的意思。要真正發出'GET'請求,請刪除整個'OutputStreamWriter'部分並附加你的'data'來請求URL,就像它應該在一個有效的GET請求中一樣:'URL requestUrl = new URL(url +「?」+ data);' 。當然你還是不要添加'submit'部分。 – 2012-03-31 10:21:32

+0

但這不會是一個GET請求,這只是直接獲取某個URL的HTML源代碼。我需要發送請求。我試圖通過完全刪除輸出流來完成此操作,但它仍然只是返回錯誤的數據。 – ZimZim 2012-03-31 10:27:24

0

//發出HTTP GET請求

HttpClient httpClientDefault1 = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost("http://www.your.targer.url.com/page.html"); 

//設置頁眉(服務器瞭解一些瀏覽器請求擲)

httpPost.setHeader("Connection", "keep-alive"); 
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"); 
httpPost.setHeader("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
httpPost.setHeader("Accept-Language", "en-us,en;q=0.5"); 
httpPost.setHeader("Host", "ec2-23-20-44-83.compute-1.amazonaws.com"); 

httpPost .setHeader( 「引用站點」,resultUrl + resultUrlAsp);

//設置參數

ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
nameValuePair.add(new BasicNameValuePair("key","")); 
nameValuePair.add(new BasicNameValuePair("txtenroll","095020693015")); 
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair)); 

//發送請求

HttpResponse httpRespnse = httpClientDefault1.execute(httpPost); 

// Get響應體

if(httpRespnse.getStatusLine().getStatusCode() != 200) { 
    InputStream in = httpRespnse.getEntity().getContent(); 
    byte b[] = new byte[1024] ; 
    StringBuilder html = new StringBuilder(""); 
    while(in.read(b) != -1) { 
     html.append((new String(b)).toString()); 
     b = new byte[1024]; 
    } 
    System.out.println(html); 
} 

也可以得到頭,HTTP參數,餅乾,管理會話通過java代碼... :) :)

+0

應該指出,這使用Apache庫。 – mateuszb 2013-11-01 13:33:38