苍穹外卖 —— 店铺营业状态和httpclient快速入门
一、前言
由于套餐管理相较于菜品管理更简单,所以是我自己敲的,这里就没必要放代码了,因为大体步骤都是一样的,而且套餐的删除还不需要考虑菜品的起售,整体难度更简单。
上一节引入了Redis,这里引入Redis的主要原因就是在店铺的营业状态这里可以通过操作Redis来改变(Redis的应用场景就是在热门、点击率高的板块使用,同时营业状态就一个字段,没必要再在MySQL中再创建一个表了)。
二、店铺营业状态
1.Redis配置类
其实在上一节中我们就已经用到了配置类了,目的是为了方便后续自动装配,所以这里就不过多赘述了。
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建Redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
//设置连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis.key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
2.文档
老样子,先看文档:

可以看到这里我们需要设计两个接口来达到目的。
3.Controller(admin)
其实使用Redis数据库相对于MySQL更简单,因为MySQL需要通过底层Mapper来达到操控持久层的效果,而Redis是没有这个概念的,我们使用的是Spring Data Redis框架,不再需要遵循Mybatis框架的规则了,甚至我们这里都不需要写Service层了。
很简单,就是自动装配Redis模板对象,然后直接对Value字段进行操作。
值得注意的是,这里我们似乎一直在使用set,相当于一直在创建SHOP_STATUS这个键,这里可能会有点不能理解,但是其实这是基于Redis的特性来使用的,Redis的字符串键值对是没有修改功能的,所以如果想要修改字段,就只能直接覆盖。
@RestController("adminShopController")
@Slf4j
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
/**
* 设置店铺营业状态
* @param status
* @return
*/
@PutMapping("/{status}")
@ApiOperation("设置店铺营业状态")
public Result setStatus(@PathVariable Integer status){
log.info("设置店铺状态为:{}",status == 1?"营业中":"打烊中");
redisTemplate.opsForValue().set(KEY,status);
return Result.success();
}
/**
* 获取店铺的营业状态
* @return
*/
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("获取店铺的营业状态为:{}",status == 1?"营业中":"打烊中");
return Result.success(status);
}
}
在ARDM中查看我们新建的键值对:

4.Controller(user)
刚刚的是服务端的Controller,我们想要达到的效果是在小程序中能查看店铺的营业状态,如果打烊就不能再点餐或者新增订单了。
所以自然的,用户端也需要一个Controller,但是用户只需要查看状态即可,不允许设置状态,所以只需要把上面的代码抄下来,然后将RequestMapping稍微修改一下即可。
@RestController("userShopController")
@Slf4j
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
/**
* 获取店铺的营业状态
* @return
*/
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("获取店铺的营业状态为:{}",status == 1?"营业中":"打烊中");
return Result.success(status);
}
}
三、httpClient快速入门
HttpClient 是一个用于发送和接收HTTP请求的客户端编程工具包,功能和Servlet正好相反,Servlet是用于接收请求,发送响应的,而HttpClient是用于发送请求,接收响应的(浏览器其实就是一个HttpClient)。
@SpringBootTest
public class HttpClientTest {
/**
* 测试通过httpclient发送get方式请求
*/
@Test
public void testGET() throws IOException {
//创建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 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();
}
}
这是我们用来测试在客户端中能否查看店铺状态信息的方法,相当于向服务端发送了获取数据的请求,得到服务端的响应,模拟了浏览器的工作。


更多推荐


所有评论(0)