2012-03-31 96 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