電商專案day14(HTTPClient&阿里雲通訊)
今日目標:
完成HTTPClient會GET和POST請求
在阿里雲網站中註冊簡訊功能 阿里雲通訊/阿里大於
自己手動編寫之前品優購寫的介面 品優購簡訊平臺
能在工程中使用HTTPClient呼叫簡訊介面
完成使用者註冊功能
一.HttpClient的get和post請求
HttpClient 是 Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP協議最新的版本和建議。
HttpClient 提供的主要的功能
(1)實現了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)
(2)支援自動轉向
(3)支援 HTTPS 協議
(4)支援代理伺服器等
我們之前所用的 solrj 中就封裝了 HttpClient
1.get請求
導包 httpclient
基於無引數的請求
public static void main(String[] args) throws IOException { // 1、模擬開啟瀏覽器 HttpClients CloseableHttpClient httpClient = HttpClients.createDefault(); // 2、設定請求物件 HttpGet HttpGet httpGet = new HttpGet("https://www.baidu.com"); // 3、發起請求 CloseableHttpResponse response = httpClient.execute(httpGet); // 4、基於狀態碼判斷,如果請求成功,返回請求結果 EntityUtils if (response.getStatusLine().getStatusCode()==200){ HttpEntity entity = response.getEntity(); //列印 System.out.println(EntityUtils.toString(entity,"utf-8")); } // 5、關閉資源 httpClient.close(); }
基於有引數的請求:
HttpGet httpGet = new HttpGet("http://www.baidu.com/s?wd=solr");
另一引數拼接的方式:
URIBuilder uri = new URIBuilder("http://www.baidu.com/s?").setParameter("wd","solr");
HttpGet httpGet = new HttpGet(String.valueOf(uri));
2.post請求
我們無法通過post請求抓取百度的資訊,會出現302重定向,所以我們通過抓取開源中國的資訊
注意:一定要設定頭資訊,如果不設定會導致,403,所以一定加入自己瀏覽器的頭資訊
public static void main(String[] args) throws IOException, URISyntaxException {
// 1、模擬開啟瀏覽器 HttpClients
CloseableHttpClient httpClient = HttpClients.createDefault();
// 2、設定請求物件 HttpGet
HttpPost httpPost = new HttpPost("https://www.oschina.net/");
//開源中國,為防止惡意網站的攻擊,需要設定請求頭資訊,才能進行訪問
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
// 3、發起請求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 4、基於狀態碼判斷,如果請求成功,返回請求結果 EntityUtils
if (response.getStatusLine().getStatusCode()==200){
HttpEntity entity = response.getEntity();
//列印
System.out.println(EntityUtils.toString(entity,"utf-8"));
}
// 5、關閉資源
httpClient.close();
}
設定帶引數的post請求
2、設定請求物件 HttpGet
HttpPost httpPost = new HttpPost("https://www.oschina.net/");
//如果通過post攜帶引數,可以通過封裝兩個引數
List<NameValuePair> paramerters = new ArrayList<NameValuePair>();
//設定兩個post引數,
paramerters.add(new BasicNameValuePair("scope","project"));
paramerters.add(new BasicNameValuePair("q","java"));
//構造一個form表單實體
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramerters,"UTF-8");
httpPost.setEntity(formEntity);
//開源中國,為防止惡意網站的攻擊,需要設定請求頭資訊,才能進行訪問
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
二.阿里雲網站註冊簡訊功能
1.註冊賬號
2.登陸系統
3.進入控制檯
4.申請簽名
5.申請模板
6.建立accessKey
下載SDK-demo測試能否收發簡訊
1.首先我們匯入官方提供的demo
2.匯入jar
3.替換我們的accesskey資訊
一些必填項,我們必須填寫,都有註釋
手機號 簽名 模板 等
成功返回的資訊
執行我們就可以咋我們自己的手機上看到驗證碼
三.搭建專案的簡訊收發平臺
搭建自己專案傳送簡訊的工程,因為可以其他模組也能用到
1.開發介面文件的編寫:
介面文件:
一般包含:請求地址、請求引數列表、響應引數列表
開發中介面文件一定要會寫
四.使用者的註冊功能
1.搭建我們需要的user工程 interface service web
思路分析:
1.輸入的密碼通過前臺js校驗
2.輸入電話號碼,呼叫介面完成簡訊傳送,
3.通過redis儲存驗證碼
4.登陸的時候,從redis中取出判斷是否與輸入的驗證碼一致
/**
* 傳送驗證碼
* @param phone
*/
@Override
public void sendSmsCode(String phone) throws IOException, ParseException {
//1.隨機成功六位數字驗證碼
int num =(int)(Math.random()*9+1);
String smsCode = RandomStringUtils.randomNumeric(5);
smsCode=num+smsCode;
//2.將生成的驗證碼存到redis中
redisTemplate.boundValueOps(phone).set(smsCode,5L, TimeUnit.MINUTES);
//3.呼叫簡訊傳送的介面進行傳送
HttpClient httpClient = new HttpClient("http://localhost:7788/sms/sendSms.do");
httpClient.addParameter("phoneNumbers",phone);
httpClient.addParameter("signName","品優購");
httpClient.addParameter("templateCode","SMS_123738164");
httpClient.addParameter("param","{\"code\":"+smsCode+"}");
//傳送
httpClient.post();
//獲取返回的訊息
String content = httpClient.getContent();
System.out.println(content);
if (content==null){
throw new RuntimeException("呼叫介面失敗");
}
}
@Override
public boolean checkSmsCode(String phone, String smsCode) {
//從redis中獲取驗證碼
String sysCode = (String) redisTemplate.boundValueOps(phone).get();
//判斷
if (sysCode==null){//取不到過期了
return false;
}
if (!sysCode.equals(smsCode)){
return false;
}
return true;
}
controller層
/**
* 增加
* @param user
* @return
*/
@RequestMapping("/add")
public Result add(@RequestBody TbUser user,String smsCode){
try {
//校驗驗證碼是否正確
boolean result = userService.checkSmsCode(user.getPhone(),smsCode);
if (result==false){
return new Result(false,"驗證碼無效");
}
userService.add(user);
return new Result(true, "增加成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "增加失敗");
}
}
/**
* 傳送驗證碼
*/
@RequestMapping("/sendSmsCode")
public Result sendSmsCode(String phone){
try {
userService.sendSmsCode(phone);
return new Result(true, "傳送成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "傳送失敗");
}
}
前臺:
//使用者註冊
$scope.register=function(){
//兩次輸入密碼是否一致
if($scope.entity.password!=$scope.entity.rePassword){
alert("兩側輸入的密碼不一致...,請重新輸入");
}
userService.add($scope.entity,$scope.smsCode).success(
function(response){
if(response.success){
//跳轉到index頁面
location.href="login.html"
}else{
alert(response.message);
}
}
);
}
//傳送簡訊驗證碼
$scope.sendSmsCode=function () {
userService.sendSmsCode($scope.entity.phone).success(function (response) {
//無論成功與否,都提示是否正常傳送
alert(response.message);
})
}
service層
//增加
this.add=function(entity,smsCode){
return $http.post('user/add.do?smsCode='+smsCode,entity );
}