苍穹外卖 day06 HttpClient、微信小程序
一、HttpClient
1、介绍
HttpClient 是阿帕奇下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。(简单来说就是在java程序中通过HttpClient工具包可以构造http请求,并发送请求)
使用:导入maven坐标(aliyun.oss底层已经使用了这个jar包,所以项目中不用再引入了)
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>4.5.13</scope>
</dependency>
核心API:
- HttpClient
- HttpClients
- CloseableHttpClient
- httpGet
- HttpPost
2、发送请求步骤:
1)创建HttpClient对象
2)创建Http请求对象
3)调用HttpClient的execute方法请求
/**
* 测试通过HttpClient发送Get方式请求
*/
@Test
public void testGet() throws Exception{
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
//发送请求
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务器端返回的状态码为:"+statusCode);
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
System.out.println("服务器端返回的数据为:"+body);
//关闭资源
response.close();
httpClient.close();
}
/**
* 测试通过HttpClient发送Post方式请求
*/
@Test
public void testPost() throws IOException {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
JSONObject jsonObject = new JSONObject();
jsonObject.put("username","admin");
jsonObject.put("password","123456");
StringEntity entity = new StringEntity(jsonObject.toString());
//指定请求编码方式
entity.setContentEncoding("utf-8");
//指定数据格式
entity.setContentType("application/json");
httpPost.setEntity(entity);
//发送请求
CloseableHttpResponse response = httpClient.execute(httpPost);
//解析返回结果
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("响应码为:"+statusCode);
HttpEntity entity1 = response.getEntity();
String body = EntityUtils.toString(entity1);//转为字符串
System.out.println("响应结果为:"+body);
//关闭资源
response.close();
httpClient.close();
}
网络编程中的方法:
response.getStatusLine()- 获取HTTP响应状态行
statusLine.getStatusCode()- 获取状态码(200/404等)
response.getEntity()- 获取HTTP响应实体
HttpGet(Apache HttpClient) - 表示HTTP GET请求
request.getURI()- 获取请求的URI
headers.getAllHeaders()- 获取所有响应头..................
二、微信小程序开发
1、简介
官方文档:微信小程序
开放注册范围:个人、企业、政府等,注:个人无法使用支付功能。
开发支持:开发文档、开发者工具、设计指南、小程序体验DEMO
步骤:注册、小程序信息完善、开发小程序、提交审核和发布
2、准备工作
1)注册小程序:上面的连接,注册
2)完善小程序信息:注册完成后,进行登录,设置小程序信息,设置小程序类目。找到开发与服务->开发管理->开发设置 保存ID以及密钥
3)下载开发者工具
地址:微信开发者工具(稳定版 Stable Build)下载地址与更新日志 | 微信开放文档
可能配置环境变量失败,配置Path:
-
右键“此电脑” → 属性 → 高级系统设置 → 环境变量
-
系统变量中找到Path点击→编辑→ 新建 → 填写可执行文件所在目录
-
点击 确定 保存。
进入应用后,点击右上角详情->本地设置->不校验合法域名.........(不勾选的话发送请求到Tomcat服务器,发送不出去)
3、入门案例
1)目录结构
包含一个描述整体程序的app和多个描述各自页面的page,一个小程序主体部分由三个文件组成,必须放在项目的根目录下,如下:


一个小程序页面由四个文件组成:

三、微信登录
1、微信登陆流程
1、调用 wx.login() 获取 临时登录凭证code (前端操作),并回传到开发者服务器。
2、调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key
GET https://api.weixin.qq.com/sns/jscode2session
请求参数
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appid | string | 是 | 小程序 appId |
| secret | string | 是 | 小程序 appSecret |
| js_code | string | 是 | 登录时获取的 code,可通过wx.login获取 |
| grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
返回参数
| 属性 | 类型 | 说明 |
|---|---|---|
| session_key | string | 会话密钥 |
| unionid | string | 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明。 |
| errmsg | string | 错误信息,请求失败时返回 |
| openid | string | 用户唯一标识 |
| errcode | int32 | 错误码,请求失败时返回 |
service层代码
package com.sky.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sky.constant.MessageConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.exception.LoginFailedException;
import com.sky.mapper.UserMapper;
import com.sky.properties.WeChatProperties;
import com.sky.service.UserService;
import com.sky.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class UserServiceImpl implements UserService {
//微信服务接口地址
public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
@Autowired
private WeChatProperties weChatProperties;
@Autowired
private UserMapper userMapper;
/**
* 微信登录
* @param userLoginDTO
* @return
*/
@Override
public User wxLogin(UserLoginDTO userLoginDTO) {
String openid = getOpenid(userLoginDTO.getCode());
//判断是否为空,如果为空表示登陆失败,抛出异常
if (openid == null) {
throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
}
//判断当前用户是否为新用户
User user = userMapper.getByOpenid(openid);
//如果是新用户,自动完成注册
if(user == null){
user = User.builder()
.openid(openid)
.createTime(LocalDateTime.now())
.build();
userMapper.insert(user);
}
//返回这个用户对象
return user;
}
/**
* 调用微信接口服务获取微信用户openid
* @param code
* @return
*/
private String getOpenid(String code){
//调用微信接口服务,获得当前用户的openid
Map<String, String> map = new HashMap<>();
map.put("appid", weChatProperties.getAppid());
map.put("secret", weChatProperties.getSecret());
map.put("js_code", code);
map.put("grant_type", "authorization_code");
String json = HttpClientUtil.doGet(WX_LOGIN, map);
JSONObject jsonObject = JSON.parseObject(json);
String openid = jsonObject.getString("openid");
return openid;
}
}
更多推荐




所有评论(0)