每次进入小网站都能看到小小的变化,反观易程序员背后维护的艰辛哈哈哈哈哈哈
从此就多了一个目标:one day做出和易烊千玺一样牛的小网站
这里面多多的知识点都是我目前都没有学会的(明明都实训了。。
页面设计 各种小图标动态效果 网站域名申请 数据库设计 需求分析 接口名称命名(很好奇https://www.xiqianyangyi.com/feed feed是啥意思) 图片、视频的发布 数据持久化 等等等等
学习短信发送的实现之前 认识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的依赖:
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();
}
按照 快速学习 的步骤
申请签名
申请模板
获取AccessKEY
测试
测试文件的编写
导入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小时有效)
就能成功收到短信啦!
https://www.smschinese.com.cn/
同上申请签名
参数
/**
* 发送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里的验证码和用户输入的验证码比对,如果通过,注册成功。
(待更新