linux发送http请求xml报文,Android入门:封装一个HTTP请求的辅助类

前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求(见 http://www.linuxidc.com/Linux/2012-07/66006.htm );此处我封装了一个HTTP的get和post的辅助类,能够更好的使用;

类名:HttpRequestUtil

提供了如下功能:

(1)模拟GET请求;

(2)模拟POST请求;

(3)模拟文件上传请求;

(4)发送XML数据;

发送GET请求

(1)public static URLConnection sendGetRequest(String url, Map params, Map headers)

参数:

(1)url:单纯的URL,不带任何参数;

(2)params:参数;

(3)headers:需要设置的HTTP请求头;

返回:

HttpURLConnection

发送POST请求

(2)public static URLConnection sendPostRequest(String url, Map params, Map headers)

参数:

(1)url:单纯的URL,不带任何参数;

(2)params:参数;

(3)headers:需要设置的HTTP请求头;

返回:

HttpURLConnection

文件上传

(3)public static boolean uploadFiles(String url, Map params, FormFile[] files)

参数:

(1)url:单纯URL

(2)params:参数;

(3)files:多个文件

返回:是否上传成功

(4)public static boolean uploadFile(String path, Map 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

packagecom.xiazdong.netword.http.util;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.InputStream;

/**

* 上传文件

*/

publicclassFormFile {

/* 上传文件的数据 */

privatebyte[] data;

privateInputStream inStream;

privateFile file;

/* 文件名称 */

privateString filname;

/* 请求参数名称*/

privateString parameterName;

/* 内容类型 */

privateString contentType ="application/octet-stream";

/**

* 此函数用来传输小文件

* @param filname

* @param data

* @param parameterName

* @param contentType

*/

publicFormFile(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

*/

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;

}

publicbyte[] getData() {

returndata;

}

publicString getFilname() {

returnfilname;

}

publicvoidsetFilname(String filname) {

this.filname = filname;

}

publicString getParameterName() {

returnparameterName;

}

publicvoidsetParameterName(String parameterName) {

this.parameterName = parameterName;

}

publicString getContentType() {

returncontentType;

}

publicvoidsetContentType(String contentType) {

this.contentType = contentType;

}

}

HttpRequestUtil.java

packagecom.xiazdong.netword.http.util;

importjava.io.BufferedReader;

importjava.io.ByteArrayOutputStream;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

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.util.HashMap;

importjava.util.Map;

importjava.util.Map.Entry;

importjava.util.Set;

/*

* 此类用来发送HTTP请求

* */

publicclassHttpRequestUtil {

/**

* 发送GET请求

* @param url

* @param params

* @param headers

* @return

* @throws Exception

*/

publicstaticURLConnection sendGetRequest(String url,

Map params, Map headers)

throwsException {

StringBuilder buf =newStringBuilder(url);

Set> entrys =null;

// 如果是GET请求,则请求参数在URL中

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

buf.append("?");

entrys = params.entrySet();

for(Map.Entry entry : 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.Entry entry : entrys) {

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

}

}

conn.getResponseCode();

returnconn;

}

/**

* 发送POST请求

* @param url

* @param params

* @param headers

* @return

* @throws Exception

*/

publicstaticURLConnection sendPostRequest(String url,

Map params, Map headers)

throwsException {

StringBuilder buf =newStringBuilder();

Set> entrys =null;

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

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

entrys = params.entrySet();

for(Map.Entry entry : 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.Entry entry : entrys) {

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

}

}

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

returnconn;

}

/**

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

*   

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

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

* @param file 上传文件

*/

publicstaticbooleanuploadFiles(String path, Map params, FormFile[] files)throwsException{

finalString BOUNDARY ="---------------------------7da2137580612";//数据分隔线

finalString endline ="--"+ BOUNDARY +"--\r\n";//数据结束标志

intfileDataLength =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");

}

}

//计算传输给服务器的实体数据总长度

intdataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;

URL url =newURL(path);

intport = 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 =newbyte[1024];

intlen =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 =newBufferedReader(newInputStreamReader(socket.getInputStream()));

if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败

returnfalse;

}

outStream.flush();

outStream.close();

reader.close();

socket.close();

returntrue;

}

/**

* 提交数据到服务器

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

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

*@paramfile 上传文件

*/

publicstaticbooleanuploadFile(String path, Map params, FormFile file)throwsException{

returnuploadFiles(path, params,newFormFile[]{file});

}

/**

* 将输入流转为字节数组

* @param inStream

* @return

* @throws Exception

*/

publicstaticbyte[] read2Byte(InputStream inStream)throwsException{

ByteArrayOutputStream outSteam =newByteArrayOutputStream();

byte[] buffer =newbyte[1024];

intlen =0;

while( (len = inStream.read(buffer)) !=-1){

outSteam.write(buffer,0, len);

}

outSteam.close();

inStream.close();

returnoutSteam.toByteArray();

}

/**

* 将输入流转为字符串

* @param inStream

* @return

* @throws Exception

*/

publicstaticString read2String(InputStream inStream)throwsException{

ByteArrayOutputStream outSteam =newByteArrayOutputStream();

byte[] buffer =newbyte[1024];

intlen =0;

while( (len = inStream.read(buffer)) !=-1){

outSteam.write(buffer,0, len);

}

outSteam.close();

inStream.close();

returnnewString(outSteam.toByteArray(),"UTF-8");

}

/**

* 发送xml数据

* @param path 请求地址

* @param xml xml数据

* @param encoding 编码

* @return

* @throws Exception

*/

publicstaticbyte[] 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());

}

returnnull;

}

//测试函数

publicstaticvoidmain(String args[])throwsException {

Map params =newHashMap();

params.put("name","xiazdong");

params.put("age","10");

HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil

.sendGetRequest(

"http://192.168.0.103:8080/Server/PrintServlet",

params,null);

intcode = conn.getResponseCode();

InputStream in = conn.getInputStream();

byte[]data = read2Byte(in);

}

}

测试代码:

Map params =newHashMap();

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 =newFormFile(file.getName(), file,"document","text/plain");

booleanisSuccess = HttpRequestUtil.uploadFile("http://192.168.0.103:8080/Server/FileServlet",null, formFile);

简单了很多,对吧?0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值