package
com.wiker;
import
java.io.BufferedReader;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
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.nio.charset.Charset;
import
java.util.HashMap;
import
java.util.Map;
import
java.util.Map.Entry;
import
java.util.Set;
import
java.util.Vector;
/**
* @author Wiker Yong Email:<a href="mailto:[email protected]">[email protected]</a>
* @date 2013-11-8 下午7:22:43
* @version 1.0-SNAPSHOT
*/
public
class
HttpUtils {
private
String defaultContentEncoding;
public
HttpUtils() {
this
.defaultContentEncoding = Charset.defaultCharset().name();
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendGet(String urlString)
throws
IOException {
return
this
.send(urlString,
"GET"
,
null
,
null
);
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @param params 参数集合
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendGet(String urlString, Map<String, String> params)
throws
IOException {
return
this
.send(urlString,
"GET"
, params,
null
);
}
/**
* 发送GET请求
*
* @param urlString URL地址
* @param params 参数集合
* @param propertys 请求属性
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendGet(String urlString, Map<String, String> params, Map<String, String> propertys)
throws
IOException {
return
this
.send(urlString,
"GET"
, params, propertys);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendPost(String urlString)
throws
IOException {
return
this
.send(urlString,
"POST"
,
null
,
null
);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @param params 参数集合
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendPost(String urlString, Map<String, String> params)
throws
IOException {
return
this
.send(urlString,
"POST"
, params,
null
);
}
/**
* 发送POST请求
*
* @param urlString URL地址
* @param params 参数集合
* @param propertys 请求属性
* @return 响应对象
* @throws IOException
*/
public
HttpRespons sendPost(String urlString, Map<String, String> params, Map<String, String> propertys)
throws
IOException {
return
this
.send(urlString,
"POST"
, params, propertys);
}
/**
* 发送HTTP请求
*
* @param urlString 地址
* @param method get/post
* @param parameters 添加由键值对指定的请求参数
* @param propertys 添加由键值对指定的一般请求属性
* @return 响映对象
* @throws IOException
*/
private
HttpRespons send(String urlString, String method, Map<String, String> parameters,
Map<String, String> propertys)
throws
IOException {
HttpURLConnection urlConnection =
null
;
if
(method.equalsIgnoreCase(
"GET"
) && parameters !=
null
) {
StringBuffer param =
new
StringBuffer();
int
i =
0
;
for
(String key : parameters.keySet()) {
if
(i ==
0
)
param.append(
"?"
);
else
param.append(
"&"
);
param.append(key).append(
"="
).append(parameters.get(key));
i++;
}
urlString += param;
}
URL url =
new
URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod(method);
urlConnection.setDoOutput(
true
);
urlConnection.setDoInput(
true
);
urlConnection.setUseCaches(
false
);
if
(propertys !=
null
)
for
(String key : propertys.keySet()) {
urlConnection.addRequestProperty(key, propertys.get(key));
}
if
(method.equalsIgnoreCase(
"POST"
) && parameters !=
null
) {
StringBuffer param =
new
StringBuffer();
for
(String key : parameters.keySet()) {
param.append(
"&"
);
param.append(key).append(
"="
).append(parameters.get(key));
}
urlConnection.getOutputStream().write(param.toString().getBytes());
urlConnection.getOutputStream().flush();
urlConnection.getOutputStream().close();
}
return
this
.makeContent(urlString, urlConnection);
}
/**
* 得到响应对象
*
* @param urlConnection
* @return 响应对象
* @throws IOException
*/
private
HttpRespons makeContent(String urlString, HttpURLConnection urlConnection)
throws
IOException {
HttpRespons httpResponser =
new
HttpRespons();
try
{
InputStream in = urlConnection.getInputStream();
BufferedReader bufferedReader =
new
BufferedReader(
new
InputStreamReader(in));
httpResponser.contentCollection =
new
Vector<String>();
StringBuffer temp =
new
StringBuffer();
String line = bufferedReader.readLine();
while
(line !=
null
) {
httpResponser.contentCollection.add(line);
temp.append(line).append(
"\r\n"
);
line = bufferedReader.readLine();
}
bufferedReader.close();
String ecod = urlConnection.getContentEncoding();
if
(ecod ==
null
)
ecod =
this
.defaultContentEncoding;
httpResponser.urlString = urlString;
httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();
httpResponser.file = urlConnection.getURL().getFile();
httpResponser.host = urlConnection.getURL().getHost();
httpResponser.path = urlConnection.getURL().getPath();
httpResponser.port = urlConnection.getURL().getPort();
httpResponser.protocol = urlConnection.getURL().getProtocol();
httpResponser.query = urlConnection.getURL().getQuery();
httpResponser.ref = urlConnection.getURL().getRef();
httpResponser.userInfo = urlConnection.getURL().getUserInfo();
httpResponser.content =
new
String(temp.toString().getBytes(), ecod);
httpResponser.contentEncoding = ecod;
httpResponser.code = urlConnection.getResponseCode();
httpResponser.message = urlConnection.getResponseMessage();
httpResponser.contentType = urlConnection.getContentType();
httpResponser.method = urlConnection.getRequestMethod();
httpResponser.connectTimeout = urlConnection.getConnectTimeout();
httpResponser.readTimeout = urlConnection.getReadTimeout();
return
httpResponser;
}
catch
(IOException e) {
throw
e;
}
finally
{
if
(urlConnection !=
null
)
urlConnection.disconnect();
}
}
/**
* 默认的响应字符集
*/
public
String getDefaultContentEncoding() {
return
this
.defaultContentEncoding;
}
/**
* 发送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)
sendGetRequest(
"http://192.168.0.103:8080/Server/PrintServlet"
,
params,
null
);
int
code = conn.getResponseCode();
InputStream in = conn.getInputStream();
byte
[]data = read2Byte(in);
}
/**
* 设置默认的响应字符集
*/
public
void
setDefaultContentEncoding(String defaultContentEncoding) {
this
.defaultContentEncoding = defaultContentEncoding;
}
}
需要引用到的文件FormFile.java如下:
package
com.wiker;
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;
}
}
响应的实体对象
package com.bshark.util;
import java.util.Vector;
/**
* 响应对象
*/
public class HttpRespons {
String urlString;
int defaultPort;
String file;
String host;
String path;
int port;
String protocol;
String query;
String ref;
String userInfo;
String contentEncoding;
String content;
String contentType;
int code;
String message;
String method;
int connectTimeout;
int readTimeout;
Vector<String> contentCollection;
/**
* @return the urlString
*/
public String getUrlString() {
return urlString;
}
/**
* @param urlString the urlString to set
*/
public void setUrlString(String urlString) {
this.urlString = urlString;
}
/**
* @return the defaultPort
*/
public int getDefaultPort() {
return defaultPort;
}
/**
* @param defaultPort the defaultPort to set
*/
public void setDefaultPort(int defaultPort) {
this.defaultPort = defaultPort;
}
/**
* @return the file
*/
public String getFile() {
return file;
}
/**
* @param file the file to set
*/
public void setFile(String file) {
this.file = file;
}
/**
* @return the host
*/
public String getHost() {
return host;
}
/**
* @param host the host to set
*/
public void setHost(String host) {
this.host = host;
}
/**
* @return the path
*/
public String getPath() {
return path;
}
/**
* @param path the path to set
*/
public void setPath(String path) {
this.path = path;
}
/**
* @return the port
*/
public int getPort() {
return port;
}
/**
* @param port the port to set
*/
public void setPort(int port) {
this.port = port;
}
/**
* @return the protocol
*/
public String getProtocol() {
return protocol;
}
/**
* @param protocol the protocol to set
*/
public void setProtocol(String protocol) {
this.protocol = protocol;
}
/**
* @return the query
*/
public String getQuery() {
return query;
}
/**
* @param query the query to set
*/
public void setQuery(String query) {
this.query = query;
}
/**
* @return the ref
*/
public String getRef() {
return ref;
}
/**
* @param ref the ref to set
*/
public void setRef(String ref) {
this.ref = ref;
}
/**
* @return the userInfo
*/
public String getUserInfo() {
return userInfo;
}
/**
* @param userInfo the userInfo to set
*/
public void setUserInfo(String userInfo) {
this.userInfo = userInfo;
}
/**
* @return the contentEncoding
*/
public String getContentEncoding() {
return contentEncoding;
}
/**
* @param contentEncoding the contentEncoding to set
*/
public void setContentEncoding(String contentEncoding) {
this.contentEncoding = contentEncoding;
}
/**
* @return the content
*/
public String getContent() {
return content;
}
/**
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
/**
* @return the contentType
*/
public String getContentType() {
return contentType;
}
/**
* @param contentType the contentType to set
*/
public void setContentType(String contentType) {
this.contentType = contentType;
}
/**
* @return the code
*/
public int getCode() {
return code;
}
/**
* @param code the code to set
*/
public void setCode(int code) {
this.code = code;
}
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
/**
* @return the method
*/
public String getMethod() {
return method;
}
/**
* @param method the method to set
*/
public void setMethod(String method) {
this.method = method;
}
/**
* @return the connectTimeout
*/
public int getConnectTimeout() {
return connectTimeout;
}
/**
* @param connectTimeout the connectTimeout to set
*/
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
/**
* @return the readTimeout
*/
public int getReadTimeout() {
return readTimeout;
}
/**
* @param readTimeout the readTimeout to set
*/
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
/**
* @return the contentCollection
*/
public Vector<String> getContentCollection() {
return contentCollection;
}
/**
* @param contentCollection the contentCollection to set
*/
public void setContentCollection(Vector<String> contentCollection) {
this.contentCollection = contentCollection;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
// TODO Auto-generated method stub
return "["
+"urlString="+urlString+"\n"
+"defaultPort="+defaultPort+"\n"
+"file="+file+"\n"
+"host="+host+"\n"
+"path="+path+"\n"
+"port="+port+"/\n"
+"protocol="+protocol+"\n"
+"query="+query+"\n"
+"ref="+ref+"\n"
+"userInfo="+userInfo+"\n"
+"contentEncoding="+contentEncoding+"\n"
+"content="+content+"\n"
+"contentType="+contentType+"\n"
+"code="+code+"\n"
+"message="+message+"\n"
+"method="+method+"\n"
+"connectTimeout="+connectTimeout+"\n"
+"readTimeout="+readTimeout+"\n"
+"contentCollection="+contentCollection+"\n"
+"]";
}
}