一、简介
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
下载地址: http://hc.apache.org/downloads.cgi
二、特性
基于标准、纯净的java语言。实现了Http1.0和Http1.1
以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
支持HTTPS协议。
通过Http代理建立透明的连接。
利用CONNECT方法通过Http代理建立隧道的https连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
插件式的自定义认证方案。
便携可靠的套接字工厂使它更容易的使用第三方解决方案。
连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
自动处理Set-Cookie中的Cookie。
插件式的自定义Cookie策略。
Request的输出流可以避免流中内容直接缓冲到socket服务器。
Response的输入流可以有效的从socket服务器直接读取相应内容。
在http1.0和http1.1中利用KeepAlive保持持久连接。
直接获取服务器发送的response code和 headers。
设置连接超时的能力。
实验性的支持http1.1 response caching。
源代码基于Apache License 可免费获取。
三、实例:调用手机短信验证码接口
第一步:
导入httpclient的配置类
public class HttpClientUtil {
static CloseableHttpClient client = null;
static {
client = HttpClients.createDefault();
}
/**
- httpClient get请求方法
- @param url 请求地址
- @param params 请求参数
- @return
*/
public static String get(String url,HashMap<String, Object> params){
try {
HttpGet httpGet = new HttpGet();
// map集合.keySet() 方法,拿到map集合中的key
// map.get(key)
// params = [name:zhangsan,age:23]
// keySet: name age
Set keySet = params.keySet();
StringBuffer stringBuffer = new StringBuffer();
// url: 127.0.0.1:8080/aaa/bbb.do
// ?t=12345679000&name=zhangsan&age=23
stringBuffer.append(url).append("?t=").append(System.currentTimeMillis());
for (String key : keySet) {
stringBuffer.append("&").append(key).append("=").append(params.get(key));
}
// 127.0.0.1:8080/aaa/bbb.do?t=12345679000&name=zhangsan&age=23
httpGet.setURI(new URI(stringBuffer.toString()));
// 发起请求,返回响应
CloseableHttpResponse execute = client.execute(httpGet);
int statusCode = execute.getStatusLine().getStatusCode();
// 如果状态码等于200 请求成功
if (200 != statusCode) {
return “”;
}
//execute.getEntity() 获取响应里面的实体对象
return EntityUtils.toString(execute.getEntity(), “utf-8”);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
- 127.0.0.1:8080/aaa/bbb.do/zhangsan/23
- get请求 参数为/传递
- @param url 请求地址
- @param params String类型数组形式 String… 变量名
- @return
*/
public static String get(String url, String…params){
try {
HttpGet httpGet = new HttpGet();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(url);
for (String string : params) {
stringBuffer.append("/").append(string);
}
httpGet.setURI(new URI(stringBuffer.toString()));
CloseableHttpResponse execute = client.execute(httpGet);
int statusCode = execute.getStatusLine().getStatusCode();
if (200 != statusCode) {
return “”;
}
return EntityUtils.toString(execute.getEntity(), “utf-8”);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String post(String url,HashMap<String, Object> params) {
try {
HttpPost httpPost = new HttpPost();
httpPost.setURI(new URI(url));
List parameters = new ArrayList();
Set keySet = params.keySet();
for (String key : keySet) {
NameValuePair e = new BasicNameValuePair(key, params.get(key).toString());
parameters.add(e);
}
HttpEntity entity = new UrlEncodedFormEntity(parameters , “utf-8”);
httpPost.setEntity(entity);
CloseableHttpResponse execute = client.execute(httpPost);
int statusCode = execute.getStatusLine().getStatusCode();
if (200 != statusCode) {
return “”;
}
return EntityUtils.toString(execute.getEntity(), “utf-8”);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
//请求网页的路径
String url = “http://t.weather.sojson.com/api/weather/city”;
String[] paramArr = {"101010100"};
String val = HttpClientUtil.get(url, paramArr);
//存取{}的格式
JSONObject parseObject = JSONObject.parseObject(val);
JSONObject object = parseObject.getJSONObject("data");
//存取[]的格式
JSONArray jsonArray = object.getJSONArray("forecast");
Object object2 = jsonArray.getJSONObject(0).get("high");
System.out.println(object2);
}
第二步:
添加短信验证的util工具类
package com.jk.sdy.util;
/**
-
系统常量
/
public class Config
{
/*- url前半部分
*/
public static final String BASE_URL = “https://api.miaodiyun.com/20150822/industrySMS/sendSMS”;
/**
- 开发者注册后系统自动生成的账号,可在官网登录后查看
*/
public static final String ACCOUNT_SID = “93d97e91c3784350b7935806b4db2816”;
/**
- 开发者注册后系统自动生成的TOKEN,可在官网登录后查看
*/
public static final String AUTH_TOKEN = “d75be1da1a4046fbb1479709a05c22fb”;
/**
- 发送短信模版ID
*/
public static final String TEMPLATE_ID = “954250279”;
/**
- 响应数据类型, JSON或XML
*/
public static final String RESP_DATA_TYPE = “json”;
}
- url前半部分
第三步:
将缓存存入到redis中
//短信验证码缓存key
public static final String SMS_VALIDATE_CODE = “smsValidateCode”;
第四步:
调用controller层执行方法调用短信验证码方法
/**
* 发送短信验证码
* @param phoneNumber 手机号
* @return
*/
@RequestMapping(“sendSmsContent”)
@ResponseBody
public String sendSmsContent(String phoneNumber){
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put(“accountSid”, Config.ACCOUNT_SID);
paramMap.put(“templateid”, Config.TEMPLATE_ID);
//随机6位数字 验证码
String validateCode = String.valueOf(new Random().nextInt(899999) + 100000);
paramMap.put("param", validateCode);
//将验证码存入redis中
String key = ConstantsConf.SMS_VALIDATE_CODE + "_" + phoneNumber;
redisTemplate.opsForValue().set(key, validateCode, 5, TimeUnit.MINUTES);
paramMap.put("to", phoneNumber);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String nowTime = sdf.format(new Date());
paramMap.put("timestamp", nowTime);
paramMap.put("sig", DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + nowTime));
String resJson = HttpClientUtil.post(Config.BASE_URL, paramMap);
JSONObject parseObject = JSON.parseObject(resJson);
String respCode = parseObject.get("respCode").toString();
if("00000".equals(respCode)){
// 请求成功
return "短信验证码发送成功";
} else {
// 请求失败
return "短信验证码发送失败";
}
}
/**
* 发送短信验证码
* @param phoneNumber 手机号
* @return
*/
@RequestMapping("sendSmsContent")
@ResponseBody
public String sendSmsContent(String phoneNumber){
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("accountSid", Config.ACCOUNT_SID);
paramMap.put("templateid", Config.TEMPLATE_ID);
//随机6位数字 验证码
String validateCode = String.valueOf(new Random().nextInt(899999) + 100000);
paramMap.put("param", validateCode);
//将验证码存入redis中
String key = ConstantsConf.SMS_VALIDATE_CODE + "_" + phoneNumber;
redisTemplate.opsForValue().set(key, validateCode, 5, TimeUnit.MINUTES);
paramMap.put("to", phoneNumber);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String nowTime = sdf.format(new Date());
paramMap.put("timestamp", nowTime);
paramMap.put("sig", DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + nowTime));
String resJson = HttpClientUtil.post(Config.BASE_URL, paramMap);
JSONObject parseObject = JSON.parseObject(resJson);
String respCode = parseObject.get("respCode").toString();
if("00000".equals(respCode)){
// 请求成功
return "短信验证码发送成功";
} else {
// 请求失败
return "短信验证码发送失败";
}
}
最后我们只需要写好前台模板手机号以及传入后台的参数来获取手机号就可以了。
方法仅供参考,谢谢大家!!!