使用java程序模拟页面发送http的post请求
在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.HttpURLConnection;
public class TestPost {
public static void testPost() throws IOException {
/**
* 首先要和URL下的URLConnection对话。 URLConnection可以很容易的从URL得到。比如: // Using
* java.net.URL and //java.net.URLConnection
*
* 使用页面发送请求的正常流程:在页面http://www.faircanton.com/message/loginlytebox.asp中输入用户名和密码,然后按登录,
* 跳转到页面http://www.faircanton.com/message/check.asp进行验证
* 验证的的结果返回到另一个页面
*
* 使用java程序发送请求的流程:使用URLConnection向http://www.faircanton.com/message/check.asp发送请求
* 并传递两个参数:用户名和密码
* 然后用程序获取验证结果
*/
URL url = new URL("http://www.faircanton.com/message/check.asp");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
/**
* 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。
* 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做:
*/
connection.setDoOutput(true);
connection.setRequestMethod("POST");
/**
* 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ...
*/
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");
out.write("username=kevin&password=*********"); //向页面传递数据。post的关键所在!
// remember to clean up
out.flush();
out.close();
/**
* 这样就可以发送一个看起来象这样的POST:
* POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT:
* text/plain Content-type: application/x-www-form-urlencoded
* Content-length: 99 username=bob password=someword
*/
// 一旦发送成功,用以下方法就可以得到服务器的回应:
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
InputStream l_urlStream;
l_urlStream = connection.getInputStream();
// 传说中的三层包装阿!
BufferedReader l_reader = new BufferedReader(new InputStreamReader(
l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine + "/r/n"; }
System.out.println(sTotalString);
} public static void main(String[] args) throws IOException {
testPost();
}
}
这个程序我已经测试通过的。
如果除了post一些数据外,还要上传文件,可以使用下面两个函数之一:
/**
* 通过HTTP协议向指定的网络地址发送文件。
* @param params 传输过程中需要传送的参数
* @param filename 需要传送的文件在本地的位置。
* @throws TransferException
*/
public String doPost(HashMap params, InputStream stream)
throws TransferException
{
URLConnection conn = null; // URL连结对象。
BufferedReader in = null; // 请求后的返回信息的读取对象。
String keyName = null;
try
{
conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "multipart/form-data"); // 设置参数
if (params != null)
{
Set keys = params.keySet();
// 遍历参数集取得参数名称和值
if (!keys.isEmpty())
{
Iterator iterator = keys.iterator();
while (iterator.hasNext())
{
keyName = (String) iterator.next();
// 将参数加入到连接对象中
conn.addRequestProperty(
keyName,
(String) params.get(keyName));
}
}
}
// 构造传输文件
//FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream( stream );
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch;
while ((ch = bis.read()) != -1)
baos.write(ch);
byte[] fileData = baos.toByteArray(); // 传输文件。
DataOutputStream dos =
new DataOutputStream(
new BufferedOutputStream(conn.getOutputStream()));
dos.write(fileData);
dos.flush();
dos.close(); in =
new BufferedReader(
new InputStreamReader(conn.getInputStream()));
//in.close();
}
catch (FileNotFoundException fe)
{
InputStream err = ((HttpURLConnection) conn).getErrorStream();
if (err == null)
throw new TransferException("网络传输时发生的未知错误");
in = new BufferedReader(new InputStreamReader(err));
}
catch (IOException ioe)
{
ioe.printStackTrace();
throw new TransferException("网络传输错误!");
} // 返回提示信息
StringBuffer response = new StringBuffer();
String line;
try
{
while ((line = in.readLine()) != null)
response.append(line + "/n");
in.close();
}
catch (IOException ioe)
{
ioe.getStackTrace();
throw new TransferException("网络响应错误!");
}
return response.toString();
} /**
* 通过HTTP协议向指定的网络地址发送文件。
* @param params 传输过程中需要传送的参数
* @param data 需要传送的内容。
* @throws TransferException
*/
public InputStream doPost(HashMap params, byte[] data)
throws TransferException
{
URLConnection conn = null; // URL连结对象。
BufferedReader in = null; // 请求后的返回信息的读取对象。
String keyName = null;
try
{
conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "multipart/form-data"); // 设置参数
if (params != null)
{
Set keys = params.keySet();
// 遍历参数集取得参数名称和值
if (!keys.isEmpty())
{
Iterator iterator = keys.iterator();
while (iterator.hasNext())
{
keyName = (String) iterator.next();
// 将参数加入到连接对象中
conn.addRequestProperty(
keyName,
(String) params.get(keyName));
}
}
} // 传输文件。
DataOutputStream dos =
new DataOutputStream(
new BufferedOutputStream(conn.getOutputStream()));
dos.write(data);
dos.flush();
dos.close();
return conn.getInputStream();
}
catch (FileNotFoundException fe)
{
InputStream err = ((HttpURLConnection) conn).getErrorStream();
if (err == null)
throw new TransferException("网络传输时发生的未知错误");
else
throw new TransferException("未知错误");
}
catch (IOException ioe)
{
ioe.printStackTrace();
throw new TransferException("网络传输错误!");
}
}
这两个函数是公司的员工写的,还没有用实际的例子测试过。
我们还可以使用htmlparse的jar包(该包及相关文档可以在http://htmlparser.sourceforge.net/这里下载)提供的函数对获取的html进行解析
例子如下:
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
public class TestHTMLParser {
public static void testHtml() {
try {
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
java.io.InputStream l_urlStream;
java.net.URL l_url = new java.net.URL("http://www.ideagrace.com/html/doc/2006/07/04/00929.html");
java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();
l_connection.connect();
l_urlStream = l_connection.getInputStream();
java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine+"/r/n";
// System.out.println(sTotalString);
}
String testText = extractText(sTotalString);
System.out.println( testText ); } catch (Exception e) {
e.printStackTrace();
} } public static String extractText(String inputHtml) throws Exception {
StringBuffer text = new StringBuffer();
Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");
// 遍历所有的节点
NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {
public boolean accept(Node node) {
return true;
}
}); System.out.println(nodes.size()); //打印节点的数量
for (int i=0;i<nodes.size();i++){
Node nodet = nodes.elementAt(i);
//System.out.println(nodet.getText());
text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n");
}
return text.toString();
} public static void test5(String resource) throws Exception {
Parser myParser = new Parser(resource);
myParser.setEncoding("GBK");
String filterStr = "table";
NodeFilter filter = new TagNameFilter(filterStr);
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(11); } public static void main(String[] args) throws Exception {
// test5("http://www.ggdig.com");
testHtml();
}
}
使用java程序模拟页面发送http的post请求的更多相关文章
- HTTPS的页面发送不了HTTP请求?——关于混合内容
我们都知道HTTPS的页面是发送不了HTTP请求的,那么是什么原因导致HTTPS页面不能发送HTTP请求呢?如果有发送的需求,怎么样才能发送?最近刚好遇到了这个问题,而且搜了半天没搜到靠谱的答案,所以 ...
- 用java程序模拟网站的登录以及文件批量上传
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; ...
- 【转载】Java程序模拟公安局人员管理系统
编程题:公安人员的管理系统1) 学生类:a) 属性:i. 身份号—默认没有,需要手动进行输入ii. 姓名iii. 性别iv. 年龄v. 密码vi. 居住地址vii. 注册日期viii. 人员的信誉程度 ...
- java apache commons HttpClient发送get和post请求的学习整理(转)
文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...
- C#模拟http 发送post或get请求
/// <summary> /// 模拟HTTP提交表单并获取返回数据 /// POST /// </summary> /// <param name="Url ...
- 【转】C#模拟http 发送post或get请求
原文地址:http://www.cnblogs.com/xssxss/archive/2012/07/03/2574554.html 模拟POST Json public static string ...
- java Web中页面跳转方式之请求转发
1.在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在Servlet01中setAttribute()保存数据在Servlet02中由getAt ...
- C#代码模拟http发送get和post请求
private string HttpPost(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)W ...
- Java通过http协议发送Get和Post请求
https://blog.csdn.net/qq_32599479/article/details/94439131
随机推荐
- Altera三速以太网IP核使用(下篇)--- 百兆网接口设计与使用
MAC IP核的主要作用是:实现数据链路层协议,分为TX方向与RX方向,TX方向实现的是在原包文的前面加上7个55和1个D5,RX方向则相反.在使用这个 MAC IP核之前,首先确认下自己使用的网卡是 ...
- Hadoop命令大全
Hadoop命令大全 分类: 云计算2011-03-01 15:04 6852人阅读 评论(0) 收藏 举报 hadoop作业任务集群class脚本 1.列出所有Hadoop Shell支持的命令 ...
- mybash的编写与调试
fork() 计算机程序设计中的分叉函数.返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记:否则,出错返回-1. fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个 ...
- 3060 抓住那头奶牛 USACO
3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它, ...
- Session丢失——解决方案
先抄下别人的作业(原帖:http://www.cnblogs.com/zhc088/archive/2011/07/24/2115497.html) Session丢失已经是一种习以为常的问题了,在自 ...
- [转]资深CTO:关于技术团队打造与管理的10问10答
一.你如何衡量软件工程师个人的工作表现?如何衡量整个工程师团队的工作表现? 主要从两方面: 这个员工做的工作是不是他同意做的或者应该做的?(What) 他们是如何完成自己的工作的?(How) 任何绩效 ...
- Windows下使用Python的Curses库时 No module named _curses问题
这个问题产生的 根本原因 是 curses 库不支持 windows.所以我们在下载完成python后(python 是自带 curses 库的),虽然在 python目录\Lib 中可以看到 c ...
- selenium自动化之处理浏览器警告弹窗
有的网站会弹出类似如下图的警告弹窗,你会发现这种弹窗在html源码中怎么也定位不到,接下来将介绍这种弹窗的处理方式. 其实这种弹窗是不属于html的元素的,他是属于浏览器自带的弹窗,所以用定位元素的方 ...
- 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果
脚本结构上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...
- 420. Count and Say【LintCode java】
Description The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, ...