使用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
随机推荐
- 时间戳Unix timestamp
(1)定义 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01 ...
- 20155232 实验四 Android程序设计
20155232 实验四 Android程序设计 一.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握 ...
- python 多线程笔记(3)-- 线程的私有命名空间
线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...
- Deep Learning 教程翻译
Deep Learning 教程翻译 非常激动地宣告,Stanford 教授 Andrew Ng 的 Deep Learning 教程,于今日,2013年4月8日,全部翻译成中文.这是中国屌丝军团,从 ...
- day 9 追踪一个蓝色的物体
# -*- coding: utf- -*- import cv2 import numpy as np #.打开摄像头 cap=cv2.VideoCapture('output.avi') ): # ...
- toString()方法简单分析
问题描述 今天在使用spotbugs代码走查时发现这样一个问题,如下, String[] myArray=new String[] {"1","2"," ...
- rocketmq Lock failed,MQ already started -c参数
今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误 java.lang.RuntimeException: Lock fail ...
- Python+MySQL开发医院网上预约系统(课程设计)二
---恢复内容开始--- 1:报错 1.1.创建表时报错 CREATE TABLE Admin ( A_ID VARCHAR(20) NOT NULL AUTO_INCREMENT, p ...
- Qt creator 最常用的13个快捷键
alt +enter // 自动创建类的定义 F1 // 查看帮助,文档 F2 // 快速到变量声明 Shift + F2 // 函数的声明和定义之间快速切换 F4 // 在 cpp 和 h 文件切换 ...
- 各web服务器的特点和优势
1.Tomcat 和 Jetty 面向java语言 天生就是重量级的web服务器.性能一般 2.IIS 只能在windows平台运行,windows作为服务器在稳定性与其他一些性能上不如类unix操作 ...