HttpClient
介绍
是apache Jakarta common下的子项目,可以用来提供高效的,最新的,功能丰富的支持HTTP协议的 客户端编程工具包 ,并且支持HTTP协议最新的版本和建议
入门案例
//pom.xml文件导入httpclient坐标 aliyun-oss里面已经包括了
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
//发送请求步骤
@SpringBootTest
public class HttpClientTest {
/*测试通过httpclient发送get方式的请求*/
@Test
public void testGET() throws IOException {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建Http请求对象
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();
}
}
//post
@Test
public void testPOST() throws Exception {
//创建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();
}
微信小程序开发
准备工作
注册小程序
https://mp.weixin.qq.com/wxopen/waregister?action=step1
完善小程序信息
下载开发者工具
https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
入门案例
目录结构:
//index.wxml (html)
<scroll-view class="scrollarea" scroll-y type="list">
<view class="container">
<view>{{msg}}</view>
<view>
<button bind:tap="getUserInfo" type="primary">获取用户信息</button>
昵称:{{nickName}}
<image style="width: 100px;height: 100px;" src="{{url}}"></image>
</view>
<view>
<button bind:tap="wxLogin" type="warn">微信登</button>
授权码:{{code}}
</view>
<view>
<button bind:tap="sendRequest" type="default">发送请求</button>
</view>
</view>
</scroll-view>
//index.js
Page({
data:{
msg:'hello world',
nickName:'',
url:'',
code:''
},
//获取微信用户的头像和昵称
getUserInfo(){
wx.getUserProfile({
desc: '获取用户信息',
success: (res)=>{
console.log(res.userInfo)
//为数据赋值
this.setData({
nickName:res.userInfo.nickName,
url:res.userInfo.avatarUrl
})
}
})
},
//微信登录,获取微信用户的授权码
wxLogin(){
wx.login({
success: (res) => {
console.log(res.code)
this.setData({
code: res.code
})
},
})
},
//发送请求
sendRequest(){
wx.request({
url: 'http://localhost:8080/user/shop/status',
method:'GET',
success: (res)=>{
console.log(res.data)
}
})
}
})
发布
点击上传
小程序点击版本管理 提交审核 发布
微信登录
导入小程序代码
微信登录流程
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
需求分析和设计
基于微信登陆实现小程序的登陆功能
如果是新用户需要自动完成注册
代码开发
//配置微信你登陆所需配置项 application-dev.yml application.yml
sky:
wechat:
appid: wx9e8dde9d2df9df58
secret: 7a354c0cab2186281c18839acf453e37
sky:
wechat:
appid: ${sky.wechat.appid}
secret: ${sky.wechat.secret}
//配置为微信用户生成jwt令牌时使用的配置项
sky:
jwt:
user-secret-key: itheima
user-ttl: 7200000
user-token-name: authentication
//写pojo类
//controller
@RestController
@RequestMapping("/user/user")
@Api(tags = "C端用户相关接口")
@Slf4j
public class UserController {
@Autowired
private UserService userService;
@Autowired
private JwtProperties jwtProperties;
@PostMapping("/login")
@ApiOperation("微信登录")
public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO) {
log.info("微信用户登录:{}",userLoginDTO.getCode());
// 微信登录
User user = userService.wxLogin(userLoginDTO);
// 为微信用户生成jwt令牌
HashMap<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.USER_ID, user.getId());
String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
UserLoginVO userLoginVO = UserLoginVO.builder()
.id(user.getId())
.openid(user.getOpenid())
.token(token)
.build();
return Result.success(userLoginVO);
}
}
//service
@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) {
// 调用微信接口服务,获取当前微信用户的Openid
String openid = getOpenid(userLoginDTO.getCode());
// 判断openId是否为空,如果为空标识登录失败,抛出业务异常
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;
}
}
//mapper
@Mapper
public interface UserMapper {
/**
* 根据id获取用户信息
* @param id
* @return
*/
User getById(String id);
/**
* 根据openid获取当前用户
* @param openid
* @return
*/
User getByOpenId(@Param("openid") String openid);
/**
* 创建新用户
* @param user
*/
@AutoFill(OperationType.INSERT)
void insert(User user);
/**
* 根据动态条件统计用户数量
* @param map
* @return
*/
Integer countByMap(Map map);
}
//mapper.xml
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into user(openid, name, phone, sex, id_number, avatar, create_time)
VALUES (#{openid},#{name},#{phone},#{sex},#{idNumber},#{avatar},#{createTime})
</insert>
//设置jwt令牌
//配置拦截器 configmvc
@Autowired
private JwtTokenUserInterceptor jwtTokenUserInterceptor;
protected void addInterceptors(InterceptorRegistry registry) {
log.info("开始注册自定义拦截器...");
registry.addInterceptor(jwtTokenUserInterceptor)
.addPathPatterns("/user/**")
.excludePathPatterns("/user/user/login")
.excludePathPatterns("/user/shop/status");
}
导入商品浏览功能代码
//查询分类接口
@RestController("userCategoryController")
@RequestMapping("/user/category")
@Api(tags = "C端-分类接口")
public class CategoryController {
@Autowired
private CategoryService categoryService;
@GetMapping("/list")
@ApiOperation("查询分类")
public Result<List<Category>> list(Integer type) {
List<Category> list = categoryService.list(type);
return Result.success(list);
}
}
//dish
@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "C端-菜品浏览接口")
public class DishController {
@Autowired
private DishService dishService;
@Autowired
private RedisTemplate redisTemplate;
/**
* 根据分类id查询菜品
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId) {
// 构造redis中的key,规则:dish_分类Id
String key = "dish_" + categoryId;
// 查询redis中是否存在菜品数据
List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
if (list != null && list.size() > 0) {
// 如果存在,直接返回,无需查询数据库
return Result.success(list);
}
// 如果不存在,查询数据库,将查询到的数据放入redis中
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
list = dishService.listWithFlavor(dish);
// 放入redis
redisTemplate.opsForValue().set(key, list);
return Result.success(list);
}
}
//service
@Override
public List<DishVO> listWithFlavor(Dish dish) {
List<Dish> dishList = dishMapper.list(dish);
ArrayList<DishVO> dishVOArrayList = new ArrayList<>();
dishList.forEach(d->{
DishVO dishVO = new DishVO();
BeanUtils.copyProperties(d, dishVO);
// 根据菜品id查询对应的口味
List<DishFlavor> flavors = dishFlavorMapper.getByDishId(d.getId());
dishVO.setFlavors(flavors);
dishVOArrayList.add(dishVO);
});
return dishVOArrayList;
}