java发送HttpClient请求及接收请求结果过程的简单实例
一.
1、写一个HttpRequestUtils工具类,包括post请求和get请求
packagecom.brainlong.framework.util.httpclient;
importnet.sf.json.JSONObject;
importorg.apache.commons.httpclient.HttpStatus;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.entity.StringEntity;
importorg.apache.http.impl.client.DefaultHttpClient;importorg.apache.http.util.EntityUtils;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjava.io.IOException;importjava.net.URLDecoder;publicclassHttpRequestUtils{
privatestaticLoggerlogger=LoggerFactory.getLogger(HttpRequestUtils.class);
//日志记录/***httpPost*@paramurl路径*@paramjsonParam参数*@return*/
publicstaticJSONObjecthttpPost(Stringurl,JSONObjectjsonParam){
returnhttpPost(url,jsonParam,false);
}
/***post请求*@paramurlurl地址*@paramjsonParam参数*@paramnoNeedResponse不需要返回结果*@return*/
publicstaticJSONObjecthttpPost(Stringurl,JSONObjectjsonParam,booleannoNeedResponse){
//post请求返回结果
DefaultHttpClienthttpClient=newDefaultHttpClient();
JSONObjectjsonResult=null;
HttpPostmethod=newHttpPost(url);
try{
if(null!=jsonParam){
//解决中文乱码问题
StringEntityentity=newStringEntity(jsonParam.toString(),"utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);}
HttpResponseresult=httpClient.execute(method);
url=URLDecoder.decode(url,"UTF-8");
/**请求发送成功,并得到响应**/
if(result.getStatusLine().getStatusCode()==200){
Stringstr="";
try{
/**读取服务器返回过来的json字符串数据**/
str=EntityUtils.toString(result.getEntity());
if(noNeedResponse){
returnnull;
}
/**把json字符串转换成json对象**/
jsonResult=JSONObject.fromObject(str);
}catch(Exceptione){
logger.error("post请求提交失败:"+url,e);
}
}
}catch(IOExceptione){
logger.error("post请求提交失败:"+url,e);
}
returnjsonResult;
}
/***发送get请求*@paramurl路径*@return*/
publicstaticJSONObjecthttpGet(Stringurl){
//get请求返回结果
JSONObjectjsonResult=null;
try{
DefaultHttpClientclient=newDefaultHttpClient();
//发送get请求
HttpGetrequest=newHttpGet(url);
HttpResponseresponse=client.execute(request);
/**请求发送成功,并得到响应**/
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
/**读取服务器返回过来的json字符串数据**/
StringstrResult=EntityUtils.toString(response.getEntity());
/**把json字符串转换成json对象**/
jsonResult=JSONObject.fromObject(strResult);
url=URLDecoder.decode(url,"UTF-8");
}else{
logger.error("get请求提交失败:"+url);
}
}catch(IOExceptione){
logger.error("get请求提交失败:"+url,e);
}
returnjsonResult;}}
2、写业务代码发送Http请求
3、MVC配置文件设置Controller扫描目录
<!--自动扫描且只扫描@Controller--> <context:component-scanbase-package="com.wiselong.multichannel"use-default-filters="false"> <context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/> </context:component-scan>
4、接收Http请求
接收post请求
@Controller
@RequestMapping(value = "/api/platform/exceptioncenter/exceptioninfo")
public class ExceptionInfoController {
//注入
@Autowired
private ExceptionInfoBiz exceptionInfoBiz;
/**
* 创建异常信息请求
* @param requestBody 请求消息内容
* @param request 请求消息头
* @return jsonObject
*/
@RequestMapping(
value="/create",
method = RequestMethod.POST
)
public ModelAndView createExceptionInfo(@RequestBody String requestBody, HttpServletRequest request) {
JSONObject jsonObject = JSONObject.fromObject(requestBody);
ComExceptionInfo comExceptionInfo = new ComExceptionInfo();
comExceptionInfo.setProjectName(jsonObject.getString("projectName"));
comExceptionInfo.setTagName(jsonObject.getString("tagName"));
exceptionInfoBiz.insert(comExceptionInfo);
//返回请求结果
JSONObject result= new JSONObject();
result.put("success", "true");
return new ModelAndView("", ResponseUtilsHelper.jsonSuccess(result.toString()));
}
}
接收get请求
@Controller
@RequestMapping(value="/api/platform/messagecenter/messages/sms")
public class SmsController {
@Autowired
SmsSendBiz smsSendBiz;
/**
* 接收手机号码和内容往短信发送表插入一条记录
* @param requestbody 请求消息内容
* @param request 请求消息头
* @return jsonObject
*/
@RequestMapping(
value="/send",
method= RequestMethod.GET
)
public ModelAndView sendSms(@RequestBody String requestbody, HttpServletRequest request) {
//获取请求URL及url后面传输的参数
String url = request.getRequestURL() + "?" + request.getQueryString();
url = BuildRequestUrl.decodeUrl(url);
String telePhone = RequestUtils.getStringValue(request, "telePhone");
String content = RequestUtils.getStringValue(request, "content");
smsSendBiz.insertTtMsQuequ(telePhone,content);
return new ModelAndView("", ResponseUtilsHelper.jsonResult("", true));
}
}
二.
get
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
public class H_client_get {
public static void main(String[] args) throws IOException {
// new类对象
HttpClient client = new HttpClient();
// 使用 GET 方法 与URL服务器进行交互
// HttpMethod method = new GetMethod("http://192.168.111.128/bak/regist.php?email=admin@admin.com&password=1234567&re_password=1234567&username=admin&nickname=管理员");
HttpMethod method = new GetMethod("http://192.168.111.128/bak/login.php?username=");
// 使用 GET 方法 ,实行与url服务器连接
client.executeMethod(method);
// 数据流输出
// method.getResponseBodyAsStream 创建字节流对象为inputStream
InputStream inputStream = method.getResponseBodyAsStream();
// InputStreamReader(inputStream)字节流转换成字符流 BufferedReader封装成带有缓冲的字符流对象了
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
// StringBuffer是字符串变量,它的对象是可以扩充和修改的 创建一个空的StringBuffer类的对象
StringBuffer stringBuffer = new StringBuffer();
// 定义字符串常量
String str= "";
// br字符流赋值给str字符串常量 str不等于空 按行输出
while((str = br.readLine()) != null){
// StringBuffer 是字符串变量,它的对象是可以扩充和修改的 将str数据赋予 stringBuffer
stringBuffer .append(str );
}
// 按照字符串循环输出stringBuffer
System.out.println(stringBuffer.toString());
// 关闭method 的 httpclient连接
method.releaseConnection();
}
}
post
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.*;
public class H_client_post {
public static void main(String[] args) throws IOException {
HttpClient client = new HttpClient();
PostMethod method = new PostMethod("http://192.168.111.128/bak/login_post.php");
//表单域的值,既post传入的key=value
NameValuePair[] date = { new NameValuePair("username","admin"),new NameValuePair("password","123457")};
//method使用表单阈值
method.setRequestBody(date);
//提交表单
client.executeMethod(method);
//字符流转字节流 循环输出,同get解释
InputStream inputStream = method.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
StringBuffer stringBuffer = new StringBuffer();
String str= "";
while((str = br.readLine()) != null){
stringBuffer .append(str );
}
System.out.println(stringBuffer.toString());
method.releaseConnection();
}
}
三.
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。
一、简介
HttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如ApacheJakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
二、特性
1.基于标准、纯净的java语言。实现了Http1.0和Http1.1
2.以可扩展的面向对象的结构实现了Http全部的方法(GET,POST,PUT,DELETE,HEAD,OPTIONS,andTRACE)。
3.支持HTTPS协议。
4.通过Http代理建立透明的连接。
5.利用CONNECT方法通过Http代理建立隧道的https连接。
6.Basic,Digest,NTLMv1,NTLMv2,NTLM2Session,SNPNEGO/Kerberos认证方案。
7.插件式的自定义认证方案。
8.便携可靠的套接字工厂使它更容易的使用第三方解决方案。
9.连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
10.自动处理Set-Cookie中的Cookie。
11.插件式的自定义Cookie策略。
12.Request的输出流可以避免流中内容直接缓冲到socket服务器。
13.Response的输入流可以有效的从socket服务器直接读取相应内容。
14.在http1.0和http1.1中利用KeepAlive保持持久连接。
15.直接获取服务器发送的responsecode和headers。
16.设置连接超时的能力。
17.实验性的支持http1.1responsecaching。
18.源代码基于ApacheLicense可免费获取。
三、使用方法
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1.创建HttpClient对象。
2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParamsparams)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntityentity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequestrequest)发送请求,该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(Stringname)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6.释放连接。无论执行方法是否成功,都必须释放连接
四、实例
packagecom.test;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.security.KeyManagementException;
importjava.security.KeyStore;
importjava.security.KeyStoreException;
importjava.security.NoSuchAlgorithmException;
importjava.security.cert.CertificateException;
importjava.util.ArrayList;
importjava.util.List;
importjavax.net.ssl.SSLContext;
importorg.apache.http.HttpEntity;
importorg.apache.http.NameValuePair;
importorg.apache.http.ParseException;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.CloseableHttpResponse;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.conn.ssl.SSLConnectionSocketFactory;
importorg.apache.http.conn.ssl.SSLContexts;
importorg.apache.http.conn.ssl.TrustSelfSignedStrategy;
importorg.apache.http.entity.ContentType;
importorg.apache.http.entity.mime.MultipartEntityBuilder;
importorg.apache.http.entity.mime.content.FileBody;
importorg.apache.http.entity.mime.content.StringBody;
importorg.apache.http.impl.client.CloseableHttpClient;
importorg.apache.http.impl.client.HttpClients;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.junit.Test;
publicclassHttpClientTest{
@Test
publicvoidjUnitTest(){
get();
}
/**
*HttpClient连接SSL
*/
publicvoidssl(){
CloseableHttpClienthttpclient=null;
try{
KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStreaminstream=newFileInputStream(newFile("d:\\tomcat.keystore"));
try{54.
//加载keyStored:\\tomcat.keystore
trustStore.load(instream,"123456".toCharArray());
}catch(CertificateExceptione){
e.printStackTrace();
}finally{
try{
instream.close();
}catch(Exceptionignore){
}
}
//相信自己的CA和所有自签名的证书
SSLContextsslcontext=SSLContexts.custom().loadTrustMaterial(trustStore,newTrustSelfSignedStrategy()).build();
//只允许使用TLSv1协议
SSLConnectionSocketFactorysslsf=newSSLConnectionSocketFactory(sslcontext,newString[]{"TLSv1"},null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
httpclient=HttpClients.custom().setSSLSocketFactory(sslsf).build();
//创建http请求(get方式)
HttpGethttpget=newHttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");
System.out.println("executingrequest"+httpget.getRequestLine());
CloseableHttpResponseresponse=httpclient.execute(httpget);
try{
HttpEntityentity=response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if(entity!=null){
System.out.println("Responsecontentlength:"+entity.getContentLength());
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
}
}finally{
response.close();
}
}catch(ParseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(KeyManagementExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(KeyStoreExceptione){
e.printStackTrace();
}finally{
if(httpclient!=null){
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
/**
*post方式提交表单(模拟用户登录请求)
*/
publicvoidpostForm(){
//创建默认的httpClient实例.
CloseableHttpClienthttpclient=HttpClients.createDefault();
//创建httppost
HttpPosthttppost=newHttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
//创建参数队列
List<namevaluepair>formparams=newArrayList<namevaluepair>();
formparams.add(newBasicNameValuePair("username","admin"));
formparams.add(newBasicNameValuePair("password","123456"));
UrlEncodedFormEntityuefEntity;
try{
uefEntity=newUrlEncodedFormEntity(formparams,"UTF-8");
httppost.setEntity(uefEntity);
System.out.println("executingrequest"+httppost.getURI());
CloseableHttpResponseresponse=httpclient.execute(httppost);
try{
HttpEntityentity=response.getEntity();
if(entity!=null){
System.out.println("--------------------------------------");
System.out.println("Responsecontent:"+EntityUtils.toString(entity,"UTF-8"));
System.out.println("--------------------------------------");
}
}finally{
response.close();
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(UnsupportedEncodingExceptione1){
e1.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//关闭连接,释放资源
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*发送post请求访问本地应用并根据传递参数不同返回不同结果
*/
publicvoidpost(){
//创建默认的httpClient实例.
CloseableHttpClienthttpclient=HttpClients.createDefault();
//创建httppost
HttpPosthttppost=newHttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
//创建参数队列
List<namevaluepair>formparams=newArrayList<namevaluepair>();
formparams.add(newBasicNameValuePair("type","house"));
UrlEncodedFormEntityuefEntity;
try{
uefEntity=newUrlEncodedFormEntity(formparams,"UTF-8");
httppost.setEntity(uefEntity);
System.out.println("executingrequest"+httppost.getURI());
CloseableHttpResponseresponse=httpclient.execute(httppost);
try{
HttpEntityentity=response.getEntity();
if(entity!=null){
System.out.println("--------------------------------------");
System.out.println("Responsecontent:"+EntityUtils.toString(entity,"UTF-8"));
System.out.println("--------------------------------------");
}
}finally{
response.close();
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(UnsupportedEncodingExceptione1){
e1.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//关闭连接,释放资源
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*发送get请求
*/
publicvoidget(){
CloseableHttpClienthttpclient=HttpClients.createDefault();
try{
//创建httpget.
HttpGethttpget=newHttpGet("http://www.baidu.com/");
System.out.println("executingrequest"+httpget.getURI());
//执行get请求.
CloseableHttpResponseresponse=httpclient.execute(httpget);
try{
//获取响应实体
HttpEntityentity=response.getEntity();
System.out.println("--------------------------------------");
//打印响应状态
System.out.println(response.getStatusLine());
if(entity!=null){
//打印响应内容长度
System.out.println("Responsecontentlength:"+entity.getContentLength());
//打印响应内容
System.out.println("Responsecontent:"+EntityUtils.toString(entity));
}
System.out.println("------------------------------------");
}finally{
response.close();
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(ParseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//关闭连接,释放资源
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*上传文件
*/
publicvoidupload(){
CloseableHttpClienthttpclient=HttpClients.createDefault();
try{
HttpPosthttppost=newHttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");
FileBodybin=newFileBody(newFile("F:\\image\\sendpix0.jpg"));
StringBodycomment=newStringBody("Abinaryfileofsomekind",ContentType.TEXT_PLAIN);
HttpEntityreqEntity=MultipartEntityBuilder.create().addPart("bin",bin).addPart("comment",comment).build();
httppost.setEntity(reqEntity);
System.out.println("executingrequest"+httppost.getRequestLine());
CloseableHttpResponseresponse=httpclient.execute(httppost);
try{
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
HttpEntityresEntity=response.getEntity();
if(resEntity!=null){
System.out.println("Responsecontentlength:"+resEntity.getContentLength());
}
EntityUtils.consume(resEntity);
}finally{
response.close();
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
以上这篇java发送HttpClient请求及接收请求结果过程的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。