易烊千玺小网站短信验证码(小行星编号)发送和验证的实现

每次进入小网站都能看到小小的变化,反观易程序员背后维护的艰辛哈哈哈哈哈哈

从此就多了一个目标:one day做出和易烊千玺一样牛的小网站

这里面多多的知识点都是我目前都没有学会的(明明都实训了。。

页面设计 各种小图标动态效果 网站域名申请 数据库设计 需求分析 接口名称命名(很好奇https://www.xiqianyangyi.com/feed feed是啥意思) 图片、视频的发布 数据持久化 等等等等

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第1张图片

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第2张图片

学习短信发送的实现之前 认识HttpClient

HttpClient

HttpClient是什么?

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

HttpClient解决HTTP协议没有的功能,使得客户端发送http请求效率变得容易,提高开发效率。

HttpClient不是一个浏览器。它是一个客户端的HTTP通信实现库。HttpClient的目标是发送和接收HTTP报文。HttpClient不会去缓存内容,执行嵌入在HTML页面中的javascript代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和HTTP运输无关的功能。

java程序发送http请求

  • jdk自带:URLConnection

  • 第三方框架:Apache的HttpClient

HttpClient的使用

我们首先导入HttpClient的依赖:

        
            org.apache.httpcomponents
            httpclient
            4.5.5
        

使用HttpClient发送请求、接收响应

1.一般需要如下几步:

(1) 创建HttpClient对象。

(2)创建请求方法的实例,并指定请求URL。

如果需要发送GET请求,创建HttpGet对象;

如果需要发送POST请求,创建HttpPost对象。

(3) 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

(6) 释放连接。无论执行方法是否成功,都必须释放连接

@Test
    /**
     * HttpClient请求资源, 通过jsoup解析Html的元素  爬虫
     * 爬虫: python
     * 测试发送一个get请求
     */
    void testGet() throws IOException {
        /*


        3. 发送请求,  相当于在浏览器敲回车
        4. 接收响应, 相当于浏览器把服务器的响应的html渲染出来
        5. 关闭资源
         */

       // 1. 创建一个HttpClient(接口)的对象,相当于打开浏览器窗口
        // CloseableHttpClient对象,
        // 第一种方式. 工具类方式创建 HttpClients 底层使用构建模式
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 第二种方式.构建模式创建  HttpClientBulder
        //CloseableHttpClient httpClient = HttpClientBuilder.create().build();


        //  2. 创建一个请求对象,绑定url:  Get请求  HttpGet,  Post请求: HttpPost,   相当于在浏览器窗口的地址栏输入网址
        //HttpGet 继承: HttpRequestBase  实现: HttpUriRequest接口,  继承: HttpRequest接口  继承:HttpMessage接口
        //url一定包含协议
        HttpGet httpGet = new HttpGet("http://www.baidu.com");


        //3. 发送请求,  相当于在浏览器敲回车
        //4. 接收响应, CloseableHttpResponse 相当于浏览器把服务器的响应的html渲染出来
        CloseableHttpResponse response = httpClient.execute(httpGet);

        //5.解析响应对象
        //得到http状态码
        int statusCode = response.getStatusLine().getStatusCode();
        log.info("状态码:{}",statusCode);

        //得到响应正文
        HttpEntity entity = response.getEntity();
        //得到响应体的大小:  get没有响应体:  返回-1
        long contentLength = entity.getContentLength();
        log.info("响应正文大小:{}",contentLength);
        //得到响应体的内容: 提供了一个工具类 EntityUtils 把响应内容转换为字符串给你
        String content = EntityUtils.toString(entity);
        log.info("响应正文:{}",content);

        //6.关闭资源
        response.close();
        httpClient.close();

    }

使用HttpClient 调用短信网关api——发送短信

短信验证

阿里云短信服务
易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第3张图片
易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第4张图片

按照 快速学习 的步骤

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第5张图片

  1. 申请签名

  1. 申请模板

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第6张图片

  1. 获取AccessKEY

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第7张图片

  1. 测试

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第8张图片

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第9张图片

测试文件的编写

导入SDK依赖

 
            com.aliyun
            alibabacloud-dysmsapi20170525
            2.0.22
        
package com.fs.sms;

import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
import com.google.gson.Gson;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

@SpringBootTest
class MySmsDemoApplicationTest {

    @Test
    void contextLoads() throws ExecutionException, InterruptedException {
        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
                .accessKeyId("xxxxxxxxxxxx")
                .accessKeySecret("xxxxxxxxxxxxxxxxxxxxxxx")
                //.securityToken("") // use STS token
                .build());


        AsyncClient client = AsyncClient.builder()
                .region("cn-hangzhou") // Region ID
                //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
                .credentialsProvider(provider)
                //.serviceConfiguration(Configuration.create()) // Service-level configuration
                // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("dysmsapi.aliyuncs.com")
                        //.setConnectTimeout(Duration.ofSeconds(30))
                )
                .build();

        // Parameter settings for API request
        SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
                .templateCode("SMS_xxxxxxx 你的模板编号")
                .phoneNumbers("用于接收测试短信的手机号")
                .templateParam("{\"code\":\"1234\"}")
                .signName("你的短信签名")
                // Request-level configuration rewrite, can set Http request parameters, etc.
                // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
                .build();
        CompletableFuture response = client.sendSms(sendSmsRequest);
        SendSmsResponse resp = response.get();
        System.out.println(new Gson().toJson(resp));
        client.close();
    }



}

如果控制台出现“ 账号余额不足”的提示 阿里云新用户可以领取 三个月有效期 100条 的免费发送

在加的钉钉群里面领取 (48小时有效)

就能成功收到短信啦!

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第10张图片

网站API短信接口

https://www.smschinese.com.cn/

同上申请签名

参数

易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第11张图片
易烊千玺小网站短信验证码(小行星编号)发送和验证的实现_第12张图片

/**
     * 发送Post请求,带参
     */
    @Test
    public void  testdoPostRequest2() {
       // 1.得到HttpClient的客户端,相当于你打开了一个浏览器窗口
      // 第一种方式. 工具类方式创建 HttpClients 底层使用构建模式
       // CloseableHttpClient httpClient = HttpClients.createDefault();
      // 第二种方式.构建模式创建  HttpClientBulder
       CloseableHttpClient  httpClient = HttpClientBuilder.create().build();
       // 2.创建一个post请求, 相当于你在浏览器窗口输入了一个网址
       // 构建uri
       URI  uri = null;
       try {
           // 将参数放入键值对类NameValuePair中,再放入集合中
           List  params = new ArrayList<>();
           params.add(new BasicNameValuePair("Uid", "本站用户名"));
           params.add(new BasicNameValuePair("Key", "接口安全秘钥"));
           params.add(new BasicNameValuePair("smsMob","要测试的手机号码"));
           params.add(new BasicNameValuePair("smsText","验证码:8888【XX公司或XX网名称】"));
           // 设置uri信息,并将参数集合放入uri;
           // 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String  value)
           uri = new URIBuilder().setScheme("http").setHost("utf8.api.smschinese.cn")
                  .setParameters(params).build();
       } catch (URISyntaxException e1) {
           e1.printStackTrace();
       }
       HttpPost httpPost = new HttpPost(uri);
       // 3.创建一个响应模型对象,用于接收服务器响应的数据
       CloseableHttpResponse  httpResponse = null;
       try {
           // 4.发送请求, 相当于你敲了一下回车
           httpResponse = httpClient.execute(httpPost);
           // 5.获取Http状态
           System.out.println("状态:" + httpResponse.getStatusLine());
           // 6.从响应模型获取响应实体
           HttpEntity  entity = httpResponse.getEntity();
           if (entity != null) {
              System.out.println("响应长度:" + entity.getContentLength());
              System.out.println("响应数据:" +  EntityUtils.toString(entity, "UTF-8"));
           }
       } catch (ClientProtocolException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           // 关闭资源
           try {
              if (httpResponse != null) {
                  httpResponse.close();
              }
              if (httpClient != null) {
                  httpClient.close();
              }
           } catch (IOException e) {
              e.printStackTrace();
           }
       }
 
    }

我猜玺子哥的小行星编号应该是 验证码工具类 产生4位随机数字 或者是 搞了个小行星编号库(应该不可能 应该只是跟小行星编号巧合了

验证码验证

得到验证码工具类生成的存在session的验证码,获取前端输入的手机号,通过短信发给用户。验证就拿session里的验证码和用户输入的验证码比对,如果通过,注册成功。

(待更新

你可能感兴趣的:(Spring,spring,spring,boot,java)