httplib java_HTTP请求封装Java工具类

本文提供了一个名为HttpUtils的Java工具类,用于封装HTTP GET和POST请求。该类支持添加请求参数和属性,能够处理HTTP响应内容并返回HttpRespons对象,包含响应的HTTP头信息和内容。
摘要由CSDN通过智能技术生成

packagecom.wiker;importjava.io.BufferedReader;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.HttpURLConnection;importjava.net.InetAddress;importjava.net.Socket;importjava.net.URL;importjava.net.URLConnection;importjava.net.URLEncoder;importjava.nio.charset.Charset;importjava.util.HashMap;importjava.util.Map;importjava.util.Map.Entry;importjava.util.Set;importjava.util.Vector;/***@authorWiker Yong Email:wikeryong@gmail.com

* @date 2013-11-8 下午7:22:43

*@version1.0-SNAPSHOT*/

public classHttpUtils {privateString defaultContentEncoding;publicHttpUtils() {this.defaultContentEncoding =Charset.defaultCharset().name();

}/*** 发送GET请求

*

*@paramurlString URL地址

*@return响应对象

*@throwsIOException*/

public HttpRespons sendGet(String urlString) throwsIOException {return this.send(urlString, "GET", null, null);

}/*** 发送GET请求

*

*@paramurlString URL地址

*@paramparams 参数集合

*@return响应对象

*@throwsIOException*/

public HttpRespons sendGet(String urlString, Map params) throwsIOException {return this.send(urlString, "GET", params, null);

}/*** 发送GET请求

*

*@paramurlString URL地址

*@paramparams 参数集合

*@parampropertys 请求属性

*@return响应对象

*@throwsIOException*/

public HttpRespons sendGet(String urlString, Map params, Mappropertys)throwsIOException {return this.send(urlString, "GET", params, propertys);

}/*** 发送POST请求

*

*@paramurlString URL地址

*@return响应对象

*@throwsIOException*/

public HttpRespons sendPost(String urlString) throwsIOException {return this.send(urlString, "POST", null, null);

}/*** 发送POST请求

*

*@paramurlString URL地址

*@paramparams 参数集合

*@return响应对象

*@throwsIOException*/

public HttpRespons sendPost(String urlString, Map params) throwsIOException {return this.send(urlString, "POST", params, null);

}/*** 发送POST请求

*

*@paramurlString URL地址

*@paramparams 参数集合

*@parampropertys 请求属性

*@return响应对象

*@throwsIOException*/

public HttpRespons sendPost(String urlString, Map params, Mappropertys)throwsIOException {return this.send(urlString, "POST", params, propertys);

}/*** 发送HTTP请求

*

*@paramurlString 地址

*@parammethod get/post

*@paramparameters 添加由键值对指定的请求参数

*@parampropertys 添加由键值对指定的一般请求属性

*@return响映对象

*@throwsIOException*/

private HttpRespons send(String urlString, String method, Mapparameters,

Map propertys) throwsIOException {

HttpURLConnection urlConnection= null;if (method.equalsIgnoreCase("GET") && parameters != null) {

StringBuffer param= newStringBuffer();int i = 0;for(String key : parameters.keySet()) {if (i == 0)

param.append("?");elseparam.append("&");

param.append(key).append("=").append(parameters.get(key));

i++;

}

urlString+=param;

}

URL url= newURL(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= newStringBuffer();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);

}/*** 得到响应对象

*

*@paramurlConnection

*@return响应对象

*@throwsIOException*/

private HttpRespons makeContent(String urlString, HttpURLConnection urlConnection) throwsIOException {

HttpRespons httpResponser= newHttpRespons();try{

InputStream in=urlConnection.getInputStream();

BufferedReader bufferedReader= new BufferedReader(newInputStreamReader(in));

httpResponser.contentCollection= new Vector();

StringBuffer temp= newStringBuffer();

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= newString(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();returnhttpResponser;

}catch(IOException e) {throwe;

}finally{if (urlConnection != null)

urlConnection.disconnect();

}

}/*** 默认的响应字符集*/

publicString getDefaultContentEncoding() {return this.defaultContentEncoding;

}/*** 发送GET请求

*@paramurl

*@paramparams

*@paramheaders

*@return*@throwsException*/

public staticURLConnection sendGetRequest(String url,

Map params, Mapheaders)throwsException {

StringBuilder buf= newStringBuilder(url);

Set> entrys = null;//如果是GET请求,则请求参数在URL中

if (params != null && !params.isEmpty()) {

buf.append("?");

entrys=params.entrySet();for (Map.Entryentry : entrys) {

buf.append(entry.getKey()).append("=")

.append(URLEncoder.encode(entry.getValue(),"UTF-8"))

.append("&");

}

buf.deleteCharAt(buf.length()- 1);

}

URL url1= newURL(buf.toString());

HttpURLConnection conn=(HttpURLConnection) url1.openConnection();

conn.setRequestMethod("GET");//设置请求头

if (headers != null && !headers.isEmpty()) {

entrys=headers.entrySet();for (Map.Entryentry : entrys) {

conn.setRequestProperty(entry.getKey(), entry.getValue());

}

}

conn.getResponseCode();returnconn;

}/*** 发送POST请求

*@paramurl

*@paramparams

*@paramheaders

*@return*@throwsException*/

public staticURLConnection sendPostRequest(String url,

Map params, Mapheaders)throwsException {

StringBuilder buf= newStringBuilder();

Set> entrys = null;//如果存在参数,则放在HTTP请求体,形如name=aaa&age=10

if (params != null && !params.isEmpty()) {

entrys=params.entrySet();for (Map.Entryentry : entrys) {

buf.append(entry.getKey()).append("=")

.append(URLEncoder.encode(entry.getValue(),"UTF-8"))

.append("&");

}

buf.deleteCharAt(buf.length()- 1);

}

URL url1= newURL(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.Entryentry : entrys) {

conn.setRequestProperty(entry.getKey(), entry.getValue());

}

}

conn.getResponseCode();//为了发送成功

returnconn;

}/*** 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:

*

*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

*@paramparams 请求参数 key为参数名,value为参数值

*@paramfile 上传文件*/

public static boolean uploadFiles(String path, Map params, FormFile[] files) throwsException{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 = newStringBuilder();

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= newStringBuilder();if(params!=null&&!params.isEmpty()){for (Map.Entry 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= newURL(path);int port = url.getPort()==-1 ? 80: url.getPort();

Socket socket= newSocket(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= newStringBuilder();

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(newInputStreamReader(socket.getInputStream()));if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败

return false;

}

outStream.flush();

outStream.close();

reader.close();

socket.close();return true;

}/*** 提交数据到服务器

*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

*@paramparams 请求参数 key为参数名,value为参数值

*@paramfile 上传文件*/

public static boolean uploadFile(String path, Map params, FormFile file) throwsException{return uploadFiles(path, params, newFormFile[]{file});

}/*** 将输入流转为字节数组

*@paraminStream

*@return*@throwsException*/

public static byte[] read2Byte(InputStream inStream)throwsException{

ByteArrayOutputStream outSteam= newByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while( (len = inStream.read(buffer)) !=-1){

outSteam.write(buffer,0, len);

}

outSteam.close();

inStream.close();returnoutSteam.toByteArray();

}/*** 将输入流转为字符串

*@paraminStream

*@return*@throwsException*/

public static String read2String(InputStream inStream)throwsException{

ByteArrayOutputStream outSteam= newByteArrayOutputStream();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数据

*@parampath 请求地址

*@paramxml xml数据

*@paramencoding 编码

*@return*@throwsException*/

public static byte[] postXml(String path, String xml, String encoding) throwsException{byte[] data =xml.getBytes(encoding);

URL url= newURL(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){returnread2Byte(conn.getInputStream());

}return null;

}//测试函数

public static void main(String args[]) throwsException {

Map params = new HashMap();

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 voidsetDefaultContentEncoding(String defaultContentEncoding) {this.defaultContentEncoding =defaultContentEncoding;

}

}

需要引用到的文件FormFile.java如下:packagecom.wiker;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;/*** 上传文件*/

public classFormFile {/*上传文件的数据*/

private byte[] data;privateInputStream inStream;privateFile file;/*文件名称*/

privateString filname;/*请求参数名称*/

privateString parameterName;/*内容类型*/

private String contentType = "application/octet-stream";/*** 此函数用来传输小文件

*@paramfilname

*@paramdata

*@paramparameterName

*@paramcontentType*/

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;

}/*** 此函数用来传输大文件

*@paramfilname

*@paramfile

*@paramparameterName

*@paramcontentType*/

publicFormFile(String filname, File file, String parameterName, String contentType) {this.filname =filname;this.parameterName =parameterName;this.file =file;try{this.inStream = newFileInputStream(file);

}catch(FileNotFoundException e) {

e.printStackTrace();

}if(contentType!=null) this.contentType =contentType;

}publicFile getFile() {returnfile;

}publicInputStream getInStream() {returninStream;

}public byte[] getData() {returndata;

}publicString getFilname() {returnfilname;

}public voidsetFilname(String filname) {this.filname =filname;

}publicString getParameterName() {returnparameterName;

}public voidsetParameterName(String parameterName) {this.parameterName =parameterName;

}publicString getContentType() {returncontentType;

}public voidsetContentType(String contentType) {this.contentType =contentType;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值