目录
HttpClient
入门案例
微信小程序开发
小程序基本结构
微信登入
商品浏览功能
查询分类功能
根据分类id查询菜品
根据分类id查询套餐
根据套餐id查询包含的菜品
通俗的说,HttpClient支持在java程序中构造和发送http请求。使用前,需要导入对应的Mavne坐标。核心的API包含HttpClient、HttpClients、CloseableHttpClient、HttpGet和HttpPost。
发送请求的步骤:创建HttpClient对象------>创建Http请求对象----->调用HttpClient的execute方法发送请求。
//创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
//发送请求,接收响应结果
CloseableHttpResponse response = httpClient.execute(httpGer)
//获取服务器返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String body=EntityUtils.toString(entity);
//关闭资源
response.close();
httpClient.close();
//创建httpClient对象
CloseableHttpClient httpClient= HttpClients.createDefault();
//创建请求对象
HttpPost httpPost=new HttpPost("http://localhost:8080/admin/employee/login");
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("username","admin");
jsonObject.addProperty("password","123456");
StringEntity entity=new StringEntity(jsonObject.toString());
//指定请求编码方式
entity.setContentEncoding("utf-8");
entity.setContentType("application/json");
//发生请求
CloseableHttpResponse response=httpClient.execute(httpPost);
//解析返回结果
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity1=response.getEntity();
String body= EntityUtils.toString(entity1);
response.close();
httpClient.close();
小程序包含一个描述整体程序的app和多个描述各自页面的page。一个小程序主体部由三个文件组成,必须放在根目录。app.js主要是小程序的逻辑,app.json是小程序公共配置,app.wxss是小程序公共样式表。
一个小程序页面由四个文件组成:js、wxml、json和wxss。其中js和wxml是必须要有的,二者的作用分别是管理页面逻辑和页面结构的。简单的说如下的index.js是包含对数据的操作定义方法之类的,index.wxml就是html。
小程序发送请求给服务器,服务器在发送给微信的服务器,然后再一层一层返回。具体的流程如下图。官方具体文档说明
微信登入后需要判断是否是新用户如果是新用户需要在数据库中完成注册。
用什么方法请求?传入什么参数?返回什么数据?
方法以post的方式请求。需要传入微信用户授权码。需要返回id、openid和token。
在代码开发钱需要配置微信的appid和secret以及我们用户端生成jwt令牌需要的key,tokenname等。
@RestController
@RequestMapping("/user/user")
@Slf4j
@Api(tags = "用户相关接口")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private JwtProperties jwtProperties;
/**
* 微信登入
* @param userLoginDTO
* @return
*/
@PostMapping("/login")
@ApiOperation("微信登入")
public Result login(@RequestBody UserLoginDTO userLoginDTO){
log.info("微信用户登录:{}",userLoginDTO.getCode());
//我微信用户登入
User user=userService.wxLogin(userLoginDTO);
//生产JWT令牌
Map claims =new HashMap<>();
claims.put(JwtClaimsConstant.USER_ID,user.getId());
String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getAdminTtl(), claims);
UserLoginVO userLoginVO=new UserLoginVO(user.getId(),user.getOpenid(),token);
return Result.success(userLoginVO);
}
在之前的笔记好像没有提及类中的属性用配置文件去定义,这里的jwt里面的属性就是根据配置文件设置的。application.yml中对jwt所用的配置信息如下,我们需要使用配置文件对实体类配置需要使用注解@ConfigurationProperties(prefix = "sky.jwt")其中prefix表示对应前缀为sky.jwt的配置信息。
sky:
jwt:
# 设置jwt签名加密时使用的秘钥
admin-secret-key: itcast
# 设置jwt过期时间
admin-ttl: 7200000
# 设置前端传递过来的令牌名称
admin-token-name: token
user-secret-key: guiji
# 设置jwt过期时间
user-ttl: 7200000
# 设置前端传递过来的令牌名称
user-token-name: authentication
@Component
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {
/**
* 管理端员工生成jwt令牌相关配置
*/
private String adminSecretKey;
private long adminTtl;
private String adminTokenName;
/**
* 用户端微信用户生成jwt令牌相关配置
*/
private String userSecretKey;
private long userTtl;
private String userTokenName;
}
业务层的逻辑:调用微信接口服务,获取当前微信用户的openid----->判断openid是否为空,如果为空表示登入失败,抛出业务异常------>判断是否是新用户,如果是自动完成注册------>返回这个用户对象。
根据产品原型,我们需要设计四个接口:查询分类、根据分类id查询菜品、根据分类id插叙套餐、根据套餐id查询包含的菜品。
用什么方法请求?传入什么参数?返回什么数据?
使用get方式请求。可以传type参数,传入1为查询菜品,传入2为查询套餐,null则全查。需要返回list存储分类信息相关的数组。
用什么方法请求?传入什么参数?返回什么数据?
使用get方式请求。需要传入分类id。返回给前端包含菜品信息和口味信息的集合,List
思路:先根据分类id查询该分类下的所有菜品集合List
用什么方法请求?传入什么参数?返回什么数据?
使用get方式请求。需要传入分类id。返回给前端包含套餐相关的集合List
用什么方法请求?传入什么参数?返回什么数据?
使用get方式请求。传入路径参数。返回给前端包含菜品相关信息的集合 List
查询语句使用的是一个连表的操作。
@Select("select sd.name, sd.copies, d.image, d.description " +
"from sky_take_out.setmeal_dish sd left join sky_take_out.dish d on sd.dish_id = d.id " +
"where sd.setmeal_id = #{setmealId}")
当时,我记得有一个接口通过postman测试是跑的通的。但是前端没有反应,后面与答案的代码比较是因为返回给前端的实体不一样导致的。如果大家有类似的问题,希望可能帮助到你。