使用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
随机推荐
- Linux - 时间相关命令 - ntpdate, date, hwclock
1. 概述 最近也不知道写啥了, 把之前的老文档整理一下, 凑个数什么的 配置时间这种工作, 偶尔还是要用一下 主要描述 3 个命令的简单适用 ntpdate hwlock 2. ntpdate 1. ...
- LIS(单调队列优化 C++ 版)(施工ing)
#include <iostream> using namespace std; #include <cstdio> ; ,x,stack[MaxN]; int main(){ ...
- 20155202 2016-2017-2 《Java程序设计》第4周学习总结
20155202 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承与多态: 子类和父类有(is a)关系,Role role1 =new Swordsma ...
- stardict词库
http://download.huzheng.org/zh_CN/ sudo tar -jxvf * -C /usr/share/stardict/dic
- 程序与程序之间共享对象:MarshalByRefObject
源自于:http://stackoverflow.com/questions/439173/message-pumps-and-appdomains/442316 程序与程序之间共享对象: Marsh ...
- [arc063F]Snuke's Coloring 2-[线段树+观察]
Description 传送门 Solution 我们先不考虑周长,只考虑长和宽. 依题意得答案下限为max(w+1,h+1),并且最后所得一定是个矩形(矩形内部无点). 好的,所以!!!答案一定会经 ...
- 二、Web框架实现
一.简单web(socket) 在前一篇WEB框架概述一文中已经详细了解了:从浏览器键入一个URL到返回HTML内容的整个过程.说到底,本质上其实就是一个socket服务端,用户的浏览器其实就是一个s ...
- HTTP简单教程
目录 HTTP简介 HTTP工作原理 HTTP消息结构 客户端请求消息 服务器响应消息 实例 HTTP请求方法 HTTP响应头信息 HTTP状态码 HTTP状态码分类 HTTP状态码列表 HTTP c ...
- NO--09今天遇到的一点小问题之axios全局注册
今天用 Vue 写项目的时候,用到 axios ,因为 axios 不能用 Vue.use() ,所以在每个 .vue 文件中使用 axios 时就需要 import , .vue 文件少的话还好说, ...
- Python 日志记录与程序流追踪(基础篇)
日志记录(Logging) More than print: 每次用 terminal debug 时都要手动在各种可能出现 bug 的地方 print 相关信息来确认 bug 的位置: 每次完成 d ...