版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qincidong/article/details/40893613
package httpclient;
import java.awt.Image;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookieSpec;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpMethodParams;
import com.company.project.model.TradePack;
/**
* @author qince
*
*/
public class HttpClientUseDemo {
/**
* 这个方法最典型的应用,就是用来获取服务器支持哪些HTTP方法。
* 当然,在HttpClient组件中有一个名称为OptionsMethod的类,支持这种形式的HTTP请求方式,调用OptionsMethod类的getAllowedMethods方法,
* 就可以很简单地实现上述的典型应用。
*
* @author qincd
* @date Oct 10, 2014 3:27:27 PM
*/
public static void main(String[] args) {
// oneSimpleDemo();
// loginSystem();
// getValidateCodeImage();
// executeInMultiThread();
// transferObject();
uploadFile(new File("d:/logs/msp/common-all.log"));
}
public static void oneSimpleDemo() {
HttpClient httpClient = new HttpClient();
// 设置代理
// httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
HttpMethod getMethod = new GetMethod("http://qincdtest.ematong.com/msp");
try {
int httpStatusCode = httpClient.executeMethod(getMethod);
if (httpStatusCode == HttpStatus.SC_OK) {
System.out.println(getMethod.getStatusLine());
System.out.println(getMethod.getResponseBodyAsString());
System.out.println("+++++++++++++++++++++++++++++++++++++++++");
System.out.println("+++++++++++++++++++++++++++++++++++++++++");
System.out.println("+++++++++++++++++++++++++++++++++++++++++");
InputStream inout = getMethod.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
inout, Charset.forName("utf-8")));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} else {
System.out.println("与远程服务器通讯发生故障");
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
getMethod.releaseConnection();
}
}
/**
* 使用httpclient模拟http请求登录系统
*
* @author qincd
* @date Oct 10, 2014 3:58:44 PM
*/
public static void loginSystem() {
HttpClient httpClient = new HttpClient();
String loginUrl = "http://qincdtest.ematong.com/msp/manage/login";
PostMethod postMethod = new PostMethod(loginUrl);
postMethod.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
NameValuePair usernamePair = new NameValuePair("username", "admin");
NameValuePair passwordPair = new NameValuePair("password", "123456");
postMethod.setRequestBody(new NameValuePair[] { usernamePair,
passwordPair });
try {
int httpStatusCode = httpClient.executeMethod(postMethod);
System.out.println(httpStatusCode);
if (httpStatusCode == HttpStatus.SC_OK) {
System.out.println(postMethod.getStatusLine());
System.out.println(postMethod.getResponseBodyAsString());
} else if (httpStatusCode == HttpStatus.SC_MOVED_PERMANENTLY
|| httpStatusCode == HttpStatus.SC_MOVED_TEMPORARILY
|| httpStatusCode == HttpStatus.SC_TEMPORARY_REDIRECT) {
Header locationHeader = postMethod.getResponseHeader("location");
String redirectUrl = locationHeader.getValue();
System.out.println("页面需要重定向到" + redirectUrl);
System.out.println("----重定向页面内容:");
GetMethod getMethod = new GetMethod(redirectUrl);
httpClient.executeMethod(getMethod);
BufferedReader br = new BufferedReader(new InputStreamReader(getMethod.getResponseBodyAsStream(),"utf-8"));
String temp = null;
while ((temp = br.readLine()) != null) {
System.out.println(temp);
}
getMethod.releaseConnection();
}
CookieSpec cookieSpec = org.apache.commons.httpclient.cookie.CookiePolicy
.getDefaultSpec();
Cookie[] cookies = cookieSpec.match("qincdtest.ematong.com", 8080,
"/", false, httpClient.getState().getCookies());
if (cookies == null || cookies.length == 0) {
System.out.println("No cookie...");
} else {
System.out.println("-----------Cookie------------------");
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":"
+ cookie.getValue());
}
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
postMethod.releaseConnection();
}
}
/**
* 根据验证码图片生成地址得到验证码图片
*
* @author qincd
* @date Oct 10, 2014 4:23:01 PM
*/
public static void getValidateCodeImage() {
// 12306登录的验证码图片地址
String imageUrl = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand";
imageUrl = "http://c.hiphotos.baidu.com/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50%3Bt%3Dgif/sign=8e3ef28e1f950a7b613846966bb809bc/3b87e950352ac65cd20ecfcbf9f2b21193138a7b.jpg";
HttpClient client = new HttpClient();
GetMethod postMethod = new GetMethod(imageUrl);
try {
int status = client.executeMethod(postMethod);
if (status == HttpStatus.SC_OK) {
InputStream input = postMethod.getResponseBodyAsStream();
Image image = ImageIO.read(input);
JFrame frame = new JFrame();
frame.setSize(500, 300);
frame.add(new JLabel("验证码:"));
frame.add(new JLabel(new ImageIcon(image)));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} else {
System.out.println("--network error.");
System.out.println(postMethod.getStatusLine());
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
postMethod.releaseConnection();
}
}
/**
* 在多线程环境中运行
*
* @author qincd
* @date Oct 10, 2014 4:56:40 PM
*/
public static void executeInMultiThread() {
MultiThreadedHttpConnectionManager threadManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(threadManager);
GetMethod gm = new GetMethod("http://www.baidu.com");
try {
int status = client.executeMethod(gm);
if (status == HttpStatus.SC_OK) {
System.out.println(gm.getStatusLine());
System.out.println(gm.getResponseBodyAsString());
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
gm.releaseConnection();
}
}
/**
* 接收一个Object对象
*
* @author qincd
* @date Oct 10, 2014 6:00:34 PM
*/
public static void transferObject() {
MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager();
HttpClient hc = new HttpClient(manager);
PostMethod pm = new PostMethod("http://qincdtest.ematong.com/rapiddemo/manage/interface/test/77");
try {
int status = hc.executeMethod(pm);
System.out.println(pm.getStatusLine());
if (status == HttpStatus.SC_OK) {
ObjectInputStream ois = new ObjectInputStream(pm.getResponseBodyAsStream());
TradePack tradePack = (TradePack) ois.readObject();
System.out.println("==========tradePack:");
System.out.println("appId:" + tradePack.getAppId());
System.out.println("tradeNo:" + tradePack.getTradeNo());
System.out.println("tradeTime:" + tradePack.getTradeTime().toLocaleString());
System.out.println("myFlowNo:" + tradePack.getMyFlowNo());
System.out.println("sign:" + tradePack.getSign());
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
pm.releaseConnection();
}
}
/**
* 上传文件
*
* @author qincd
* @throws FileNotFoundException
* @date Oct 10, 2014 6:00:50 PM
*/
public static void uploadFile(File file) {
HttpClient hc = new HttpClient();
String uploadUrl = "http://qincdtest.ematong.com/rapiddemo/manage/interface/upload";
PostMethod pm = new PostMethod(uploadUrl);
try {
FilePart fp = new FilePart("filepart",file);
Part[] parts = {fp,new StringPart("uploadpath",file.getAbsolutePath()),new StringPart("uploadTime",new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()))};
HttpMethodParams hmps = pm.getParams();
MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts,hmps);
pm.setRequestEntity(requestEntity);
hc.getHttpConnectionManager().getParams().setConnectionTimeout(60*1000);
int status = hc.executeMethod(pm);
if (status == HttpStatus.SC_OK) {
System.out.println(pm.getStatusLine());
System.out.println(pm.getResponseBodyAsString());
System.out.println("file upload success.");
}
else {
System.out.println("upload error.");
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
pm.releaseConnection();
}
}
}
package com.company.project.controller;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import javacommon.base.BaseRestSpringController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.company.project.model.TradePack;
import com.company.project.util.EApiUtil;
/**
* @author qince
*
*/
@Controller
@RequestMapping("/manage/interface")
public class HttpClientObjectTransfer extends BaseRestSpringController<TradePack, Long>{
/**
* 输出对象
*
* @author qincd
* @throws IOException
* @date Oct 10, 2014 5:11:55 PM
*/
@RequestMapping("/test/{appId}")
public String writeObject(@PathVariable String appId,HttpServletResponse response) throws IOException {
System.out.println("appId:" + appId);
TradePack tradePack = new TradePack();
tradePack.setAppId(appId);
tradePack.setMyFlowNo("M01");
tradePack.setTradeNo("0324");
String sign = EApiUtil.callInnerSign(tradePack);
System.out.println("sign:" + sign);
tradePack.setSign(sign);
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
oos.writeObject(tradePack);
oos.close();
return null;
}
/**
* 通过commons-fileupload上传文件
*
* @author qincd
* @date Oct 10, 2014 6:05:33 PM
*/
@RequestMapping("/upload")
public String upload(HttpServletRequest request,HttpServletResponse response) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4*1024); // 设置缓冲区大小
File tmpDir = new File("d:/tmp");
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
factory.setRepository(tmpDir);
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setSizeMax(10*1024*1024); // 设置最大文件尺寸
try {
List<FileItem> files = sfu.parseRequest(request);
for (FileItem fi : files) {
if (fi.isFormField()) { // 表单元素
System.out.println(fi.getFieldName() + "=" + fi.getString());
}
else {
String fileName = fi.getName();
File storeDir = new File("d:/files/");
if (!storeDir.exists()) {
storeDir.mkdirs();
}
File saveFile = new File(storeDir,fileName);
fi.write(saveFile);
System.out.println("file [" + fileName + "] upload success.");
}
}
response.getWriter().println("file upload successfully.");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.company.project.model;
import java.io.Serializable;
import java.util.Date;
public class TradePack implements Serializable{
private String appId;
private String sign;
private String myFlowNo;
private String tradeNo;
private Date tradeTime;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getMyFlowNo() {
return myFlowNo;
}
public void setMyFlowNo(String myFlowNo) {
this.myFlowNo = myFlowNo;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
/**
* @return the tradeTime
*/
public Date getTradeTime() {
return tradeTime;
}
/**
* @param tradeTime the tradeTime to set
*/
public void setTradeTime(Date tradeTime) {
this.tradeTime = tradeTime;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
}
可以通过Httpclient来实现各个系统间的接口调用,文件上传等。