所以我有这段代码,我得到它的工作,现在它基本上允许我发送http post并获取几乎任何我想要的外部网站的请求除非元素不包含name属性。这是一个例子:
这是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>
现在因为Submit按钮没有name属性,我无法向它发送正确的HTTP Get / Post请求(我知道在这种情况下它是一个get方法)。如何用(适当的键/值)替换String数据,以便它实际向此表单发送请求?
答案 0 :(得分:1)
我正在使用HttpClient生成http请求
HttpClient是开源apache项目。你可以获得广泛的代码。 HttpClient 4.1版是一套很好的Http api
答案 1 :(得分: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
答案 2 :(得分: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);
//获取响应正文
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);
}
你也可以通过java代码获取标题,http参数,cookie,管理会话...... :):)
答案 3 :(得分:0)
我有一个ClientHttpRequest类,可以执行所有多部分,文件等,并具有可选的进度跟踪和取消。它已经存在了大约10年。使用起来非常简单。 现在还有一个Scala版本。 https://github.com/vpatryshev/ScalaKittens/blob/master/src/main/scala/scalakittens/ClientHttpRequest.scala