1. 程式人生 > >電商專案day14(HTTPClient&阿里雲通訊)

電商專案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 );
	}