- 浏览: 180328 次
文章分类
- 全部博客 (158)
- java (4)
- Android (3)
- oracle (2)
- IT人士如何节电 (5)
- json (1)
- web (1)
- acm_dfs (1)
- 组合数学 (1)
- 图论 (1)
- C (1)
- ACM搜索专题 (1)
- html+css+javascript (1)
- windows32 (1)
- MyEclipse (1)
- 产品思考 (1)
- c++ (1)
- 程序与生活 (1)
- 技术 (1)
- SQL Server (1)
- Android 移动开发 (1)
- 垃圾产品--linux (1)
- 学习与科研方法 (1)
- tomcat (1)
- ACM----动态规划 (1)
- 算法 (1)
- Python (1)
- 教程 (1)
- 数据库 (1)
- 浏览器 (1)
- 业界 (1)
- Go语言编程 (1)
- 软件开发 (1)
- linux、unix (1)
- 开发相关 (1)
- openoffice (1)
- DirectX (1)
- 统计分析与数据挖掘 (1)
- Andriod (1)
- SQL (1)
- oracle 体系结构 (1)
- ATL/WTL (1)
- KMP (1)
- 线段树 (1)
- AnGo (1)
- UVA_OJ (1)
- DP (1)
- APUE/UNP (1)
- redmine (1)
最新评论
-
美丽的小岛:
while (true) {
pool.execute(new ...
Java多线程 Web服务器简单实现 -
chemistry_ken:
Google自己都没有应用用这门语言,说明还有很长的一段路走啊 ...
[置顶] 为什么我们需要一门新语言——Go语言 -
zui4yi1:
agile,新进的公司就是采用敏捷开发的。了解AGILE,其实 ...
敏捷的坏态度 -
free0007:
...
程序与生活:程序员要保持好奇心 -
haohao-xuexi02:
witcheryne 写道昨天一不小心手贱: git co * ...
为了我的幸福
经过自己的研究,封装了一个HTTP的get和post的辅助类,能够更好的使用;
类名:HttpRequestUtil
提供了如下功能:
(1)模拟GET请求;
(2)模拟POST请求;
(3)模拟文件上传请求;
(4)发送XML数据;
发送GET请求
(1) public static URLConnection sendGetRequest(String url, Map<String, String> params, Map<String, String> headers)
参数:
(1)url:单纯的URL,不带任何参数;
(2)params:参数;
(3)headers:需要设置的HTTP请求头;
返回:
HttpURLConnection
发送POST请求
(2)public static URLConnection sendPostRequest(String url, Map<String, String> params, Map<String, String> headers)
参数:
(1)url:单纯的URL,不带任何参数;
(2)params:参数;
(3)headers:需要设置的HTTP请求头;
返回:
HttpURLConnection
文件上传
(3)public static boolean uploadFiles(String url, Map<String, String> params, FormFile[] files)
参数:
(1)url:单纯URL
(2)params:参数;
(3)files:多个文件
返回:是否上传成功
(4)public static boolean uploadFile(String path, Map<String, String> params, FormFile file)
参数:
(1)url:单纯URL
(2)params:参数;
(3)file:一个文件
返回:是否上传成功
发送XML数据
(5)public static byte[] postXml(String url, String xml, String encoding)
参数:
(1)url:单纯URL
(2)xml:XML数据
(3)XML数据编码
对于上传文件,FormFile的构造函数声明如下:
(1)public FormFile(String filname, byte[] data, String parameterName, String contentType)
参数:
(1)filname:文件的名称
(2)data:文件的数据
(3)parameterName:HTML的文件上传控件的参数的名字
(4)contentType:文件类型,比如text/plain为txt
(2)public FormFile(String filname, File file, String parameterName, String contentType)
参数:
(1)filname:文件的名称
(2)file:文件名
(3)parameterName:HTML的文件上传控件的参数的名字
(4)contentType:文件类型,比如text/plain为txt
FormFile.java
package com.xiazdong.netword.http.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; /** * 上传文件 */ public class FormFile { /* 上传文件的数据 */ private byte[] data; private InputStream inStream; private File file; /* 文件名称 */ private String filname; /* 请求参数名称*/ private String parameterName; /* 内容类型 */ private String contentType = "application/octet-stream"; /** * 此函数用来传输小文件 * @param filname * @param data * @param parameterName * @param contentType */ public FormFile(String filname, byte[] data, String parameterName, String contentType) { this.data = data; this.filname = filname; this.parameterName = parameterName; if(contentType!=null) this.contentType = contentType; } /** * 此函数用来传输大文件 * @param filname * @param file * @param parameterName * @param contentType */ public FormFile(String filname, File file, String parameterName, String contentType) { this.filname = filname; this.parameterName = parameterName; this.file = file; try { this.inStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } if(contentType!=null) this.contentType = contentType; } public File getFile() { return file; } public InputStream getInStream() { return inStream; } public byte[] getData() { return data; } public String getFilname() { return filname; } public void setFilname(String filname) { this.filname = filname; } public String getParameterName() { return parameterName; } public void setParameterName(String parameterName) { this.parameterName = parameterName; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } }
HttpRequestUtil.java
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/*
* 此类用来发送HTTP请求
* */
public class HttpRequestUtil {
/**
* 发送GET请求
* @param url
* @param params
* @param headers
* @return
* @throws Exception
*/
public static URLConnection sendGetRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception {
StringBuilder buf = new StringBuilder(url);
Set<Entry<String, String>> entrys = null;
// 如果是GET请求,则请求参数在URL中
if (params != null && !params.isEmpty()) {
buf.append("?");
entrys = params.entrySet();
for (Map.Entry<String, String> entry : entrys) {
buf.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length() - 1);
}
URL url1 = new URL(buf.toString());
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
conn.setRequestMethod("GET");
// 设置请求头
if (headers != null && !headers.isEmpty()) {
entrys = headers.entrySet();
for (Map.Entry<String, String> entry : entrys) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode();
return conn;
}
/**
* 发送POST请求
* @param url
* @param params
* @param headers
* @return
* @throws Exception
*/
public static URLConnection sendPostRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception {
StringBuilder buf = new StringBuilder();
Set<Entry<String, String>> entrys = null;
// 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10
if (params != null && !params.isEmpty()) {
entrys = params.entrySet();
for (Map.Entry<String, String> entry : entrys) {
buf.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length() - 1);
}
URL url1 = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(buf.toString().getBytes("UTF-8"));
if (headers != null && !headers.isEmpty()) {
entrys = headers.entrySet();
for (Map.Entry<String, String> entry : entrys) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode(); // 为了发送成功
return conn;
}
/**
* 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
* <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">
<INPUT TYPE="text" NAME="name">
<INPUT TYPE="text" NAME="id">
<input type="file" name="imagefile"/>
<input type="file" name="zip"/>
</FORM>
* @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
* @param params 请求参数 key为参数名,value为参数值
* @param file 上传文件
*/
public static boolean uploadFiles(String path, Map<String, String> params, FormFile[] files) throws Exception{
final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志
int fileDataLength = 0;
if(files!=null&&files.length!=0){
for(FormFile uploadFile : files){//得到文件类型数据的总长度
StringBuilder fileExplain = new StringBuilder();
fileExplain.append("--");
fileExplain.append(BOUNDARY);
fileExplain.append("\r\n");
fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
fileExplain.append("\r\n");
fileDataLength += fileExplain.length();
if(uploadFile.getInStream()!=null){
fileDataLength += uploadFile.getFile().length();
}else{
fileDataLength += uploadFile.getData().length;
}
}
}
StringBuilder textEntity = new StringBuilder();
if(params!=null&&!params.isEmpty()){
for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
textEntity.append("--");
textEntity.append(BOUNDARY);
textEntity.append("\r\n");
textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
textEntity.append(entry.getValue());
textEntity.append("\r\n");
}
}
//计算传输给服务器的实体数据总长度
int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;
URL url = new URL(path);
int port = url.getPort()==-1 ? 80 : url.getPort();
Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);
OutputStream outStream = socket.getOutputStream();
//下面完成HTTP请求头的发送
String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";
outStream.write(requestmethod.getBytes());
String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
outStream.write(accept.getBytes());
String language = "Accept-Language: zh-CN\r\n";
outStream.write(language.getBytes());
String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";
outStream.write(contenttype.getBytes());
String contentlength = "Content-Length: "+ dataLength + "\r\n";
outStream.write(contentlength.getBytes());
String alive = "Connection: Keep-Alive\r\n";
outStream.write(alive.getBytes());
String host = "Host: "+ url.getHost() +":"+ port +"\r\n";
outStream.write(host.getBytes());
//写完HTTP请求头后根据HTTP协议再写一个回车换行
outStream.write("\r\n".getBytes());
//把所有文本类型的实体数据发送出来
outStream.write(textEntity.toString().getBytes());
//把所有文件类型的实体数据发送出来
if(files!=null&&files.length!=0){
for(FormFile uploadFile : files){
StringBuilder fileEntity = new StringBuilder();
fileEntity.append("--");
fileEntity.append(BOUNDARY);
fileEntity.append("\r\n");
fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
outStream.write(fileEntity.toString().getBytes());
if(uploadFile.getInStream()!=null){
byte[] buffer = new byte[1024];
int len = 0;
while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
outStream.write(buffer, 0, len);
}
uploadFile.getInStream().close();
}else{
outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
}
outStream.write("\r\n".getBytes());
}
}
//下面发送数据结束标志,表示数据已经结束
outStream.write(endline.getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
return false;
}
outStream.flush();
outStream.close();
reader.close();
socket.close();
return true;
}
/**
* 提交数据到服务器
* @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
* @param params 请求参数 key为参数名,value为参数值
* @param file 上传文件
*/
public static boolean uploadFile(String path, Map<String, String> params, FormFile file) throws Exception{
return uploadFiles(path, params, new FormFile[]{file});
}
/**
* 将输入流转为字节数组
* @param inStream
* @return
* @throws Exception
*/
public static byte[] read2Byte(InputStream inStream)throws Exception{
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len = inStream.read(buffer)) !=-1 ){
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return outSteam.toByteArray();
}
/**
* 将输入流转为字符串
* @param inStream
* @return
* @throws Exception
*/
public static String read2String(InputStream inStream)throws Exception{
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len = inStream.read(buffer)) !=-1 ){
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return new String(outSteam.toByteArray(),"UTF-8");
}
/**
* 发送xml数据
* @param path 请求地址
* @param xml xml数据
* @param encoding 编码
* @return
* @throws Exception
*/
public static byte[] postXml(String path, String xml, String encoding) throws Exception{
byte[] data = xml.getBytes(encoding);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding);
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
conn.setConnectTimeout(5 * 1000);
OutputStream outStream = conn.getOutputStream();
outStream.write(data);
outStream.flush();
outStream.close();
if(conn.getResponseCode()==200){
return read2Byte(conn.getInputStream());
}
return null;
}
//测试函数
public static void main(String args[]) throws Exception {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "xiazdong");
params.put("age", "10");
HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil
.sendGetRequest(
"http://192.168.0.103:8080/Server/PrintServlet",
params, null);
int code = conn.getResponseCode();
InputStream in = conn.getInputStream();
byte[]data = read2Byte(in);
}
}
测试代码:
Map<String,String> params = new HashMap<String,String>(); params.put("name", name.getText().toString()); params.put("age", age.getText().toString()); HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil.sendGetRequest("http://192.168.0.103:8080/Server/PrintServlet", params, null);
文件上传测试代码:
FormFile formFile = new FormFile(file.getName(), file, "document", "text/plain"); boolean isSuccess = HttpRequestUtil.uploadFile("http://192.168.0.103:8080/Server/FileServlet", null, formFile);
相关推荐
- **Android应用项目**:结合所学知识,完成一个完整的应用开发项目。 - **图形图像**:熟悉Canvas绘图API,掌握Bitmap的使用方法。 - **View/SurfaceView**:理解View与SurfaceView的区别与联系,实现复杂的图形...
- **多态**:一个接口可以有多种不同的实现,提高程序的灵活性和扩展性。 3. Java类库 - **集合框架**:ArrayList、LinkedList、HashMap等数据结构,用于存储和操作对象。 - **I/O流**:用于文件读写、网络通信...
这份"Android自定义控件开发.rar"压缩包包含了一本名为《Android自定义控件开发入门与实战》的PDF教程,旨在帮助Android开发者深入理解和实践自定义控件的创建。 自定义控件在Android开发中的价值主要体现在以下几...
- **Android基础**:安装Android SDK,配置开发环境,编写第一个Hello World程序。 - **UI组件**:熟练使用XML布局,掌握常见的UI组件,如Button、TextView等,以及高级组件如MapView、WebView等。 - **四大组件*...
"Education:教师资格证考试APP" 是一个专为准备教师资格证考试的初学者设计的Android应用程序,旨在帮助用户高效地掌握考试所需的知识点。作为一个初学者在Android开发上的尝试,这个项目充分展示了移动应用开发的...
### WebRTC零基础开发者教程 #### 一、工具 **1.1 depot_tools:** - **目标:** `depot_tools` 是一套由...以上内容为《WebRTC 零基础开发者教程》的部分章节总结,旨在为初学者提供一个全面的 WebRTC 开发入门指南。
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
React Native是Facebook推出的一个开源库,它允许开发者使用JavaScript和React的语法来编写原生的iOS和Android应用,实现了“Write Once, Run Everywhere”的理念。 在项目中,TypeScript被选为编程语言,这是一种...
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....