【苍穹外卖】Day 6 HttpClient、wx小程序

news2024/12/22 17:12:16

1 HttpClient

        HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议

        HttpClient 是一个用于发送 HTTP 请求并接收响应的类或库,在不同的编程语言中有不同的实现。它通常用于与 Web 服务进行交互,尤其是在 RESTful API 的场景下。HttpClient 能够处理各种类型的 HTTP 请求,如 GETPOSTPUTDELETE 等,还可以设置请求头、超时、身份验证等

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

核心API:

  • HttpClient
  • HttpClients
  • CloseableHttpClient
  • HttpGet
  • HttpPost

发送请求步骤:

  1. 创建 HttpClient 对象
  2. 创建 Http 请求对象(如GET、POST)
  3. 调用 HttpClient 的 execute 方法发送请求

1.1 GET

首先运行springboot,然后开启redis server

运行测试类:

如果改成访问 admin,就会失败,因为没有 jwt 令牌

1.2 POST

2 wx小程序

使用 微信开发者工具

2.1 入门案例

小程序目录结构:

包含一个描述整体程序的 app 和多个描述各自页面的 page

一个小程序 主体部分 由三个文件组成,必须放在项目的根目录:

文件是否必需作用
app.js小程序逻辑
app.json小程序公共配置
app.wxss小程序公共样式表

wxss:wx Style Sheets

css:Cascading Style Sheets 层叠样式表,CSS 用于控制网页的外观和布局,通过为 HTML 元素设置样式属性(如颜色、字体、排版和布局等),从而实现网页的美化与响应式设计

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

文件类型是否必需作用
js页面逻辑
wxml

页面结构

json页面配置
wxss页面样式表

页面逻辑

// index.js
Page({
    data: {
        msg: 'hello',
        nickName: '',
        img: '',
        authorizationCode: '',
        status: ''
    },
    //获取用户头像和昵称
    getUserInfo() {
        wx.getUserProfile({
            desc: '获取用户头像和昵称',
            success: (res) => {
                console.info(res.userInfo)

                this.setData({
                    nickName: res.userInfo.nickName,
                    img: res.userInfo.avatarUrl
                })
            }
        })
    },

    login() {
        wx.login({
            success: (res) => {
                this.setData({
                    authorizationCode: res.code
                })
            },
        })
    },

    sendRequest() {
        wx.request({
            url: 'http://localhost:8080/user/shop/status',
            method: 'GET',
            success: (res) => {
                console.log(res.data)
                this.setData({
                    status: res.data
                })
            }
        })
    }
})

页面结构

<!--index.wxml-->
<navigation-bar title="Weixin" back="{{false}}" color="black" background="#FFF"></navigation-bar>
<views>
    <view class="container">
        {{msg}}
    </view>

    <view>
        <button type="primary" bind:tap="getUserInfo">get user info</button>
        nickname:{{nickName}}
        <image style="width: 30px ;height: 30px;" src="{{img}}"></image>
    </view>

    <view>
        <button bind:tap="login" type="default">login</button>
        authorizationCode: {{authorizationCode}}
    </view>

    <view>
        <button bind:tap="sendRequest" type="warn">send request to get status</button>
        status is [{{status}}]
    </view>
</views>

效果:

审核中

2.2 微信登录 接口设计

时序图

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

接口设计:

第一个 user 代表 用户端

第二个 user 代表 用户模块

 

实现:

配置wx

配置客户端的 jwt 校验

在配置属性类里面已经规定好了

数据封装

DTO

要传输的数据

 VO

要展示、要返回的数据

2.3 实现

小程序登录 / 小程序登录 (qq.com)

controller

package com.sky.controller.user;

import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.UserService;
import com.sky.utils.JwtUtil;
import com.sky.vo.UserLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;

@RestController
@RequestMapping("/user/user")
@Api(tags = "用户相关接口")
public class UserController {
    @Autowired
    private UserService userService;

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 用户微信登录
     *
     * @return
     */
    @PostMapping("/login")
    @ApiOperation("用户微信登录")
    public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO) {
        // 微信登录
        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

package com.sky.service.impl;

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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service
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
     */
    public User wxLogin(UserLoginDTO userLoginDTO) {
        //调用微信接口服务,获得当前微信用户的 openid
        Map<String, String> map = new HashMap<>();
        map.put("appid", weChatProperties.getAppid());
        map.put("secret", weChatProperties.getSecret());
        map.put("js_code", userLoginDTO.getCode());
        map.put("grant_type", "authorization_code");
        String string = HttpClientUtil.doGet(WX_LOGIN, map);

        // fastJSON 解析 JSON 对象
        JSONObject jsonObject = JSONObject.parseObject(string);
        // 通过 key,访问 openid
        String openid = jsonObject.getString("openid");
        //判断 openid 是否为空,如果为空,要抛出登录失败异常
        if (openid == null) {
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }

        //判断当前用户是否为新用户(数据库查询是否包含openid)
        User user = userMapper.getByOpenid(openid);

        //新用户要注册
        if (user == null) {
            user = User.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();

            userMapper.add(user);
        }

        return user;
    }
}

mapper

package com.sky.mapper;

import com.sky.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    /**
     * 根据 openid 查询用户
     *
     * @param openid
     * @return
     */
    @Select("select * from sky_take_out.user where openid = #{openid}")
    User getByOpenid(String openid);

    /**
     * 新增用户
     * 这里要注意要返回主键
     *
     * @param newUser
     */
    void add(User newUser);
}

xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.sky.mapper.UserMapper">

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into sky_take_out.user
            (openid, name, phone, sex, id_number, avatar, create_time)
        values (#{openid}, #{name}, #{phone}, #{sex}, #{idNumber}, #{avatar}, #{createTime})

    </insert>
</mapper>

2.4 测试

3 商品浏览

注意这里,名称要 与前端保持一致 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昵称重复怎么办?一招教你轻松搞定!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hi,大家好!我是你们的技术分享小助手——小米,29岁,活泼好动,最喜欢分享各种实用的技术知识啦!今天我们要聊的主题是“个人项目篇:如何管理昵称重…

Knife4J + Springdoc + SpringBoot2美化Swagger文档

前言 我们知道利用Swagger-UI结合Swagger提供的注解&#xff0c;在SpringBoot项目上可以将接口以HTML形式&#xff08;swagger-ui.html&#xff09;呈现出来&#xff0c;并且可以在线调试。但是老外的审美和使用习惯可能不太符合中国开发者的喜好。于是Knife4J&#xff08;htt…

搜维尔科技:特斯拉人形机器人采用Manus VR数据手套来捕捉手指动作的特点和优势

1.高保真手指追踪&#xff1a;能够提供精确的手指动作捕捉&#xff0c;包括手指的弯曲、伸展、旋转等动作&#xff0c;并且不受遮挡限制。这种高保真的手指追踪能力对于机器人准确模拟人类手部动作至关重要。 2.触觉反馈系统&#xff1a;部分型号的数据手套可能具备触觉反馈功能…

【Python】超详细基础语法总结

Python大礼包&#xff1a;【2024年最新Python全套学习资料包】免费领取&#xff01; 1.字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的固定的值 1.1Python常用的6种值&#xff08;数据&#xff09;的类型 1.2代码练习&#xff08;输出字面量&#xff09; > p…

蓝牙技术|超高精度蓝牙位置服务将成为蓝牙定位产品发展方向

随着市场需求的变化&#xff0c;精确的距离测量成为提升安全性和用户体验的重要因素。预计未来五年蓝牙位置服务设备的年均增长率为22%&#xff0c;到2028年出货量将达到5.63亿台。 为了满足这一需求&#xff0c;SIG即将在2024年下半年推出一项新功能——蓝牙信道探测(Blueto…

C语言6大常用标准库 -- 1.<stdio.h>

目录 引言 1.<stdio.h>&#xff08;标准输入输出库&#xff09; 1.1 简介 1.2 库变量 1.3 库宏 1.4 库函数 &#x1f308;你好呀&#xff01;我是 程序猿 &#x1f30c; 2024感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&am…

电影票API接口对接全攻略,让你轻松对接API

电影票API接口对接是指将第三方电影票销售平台的服务集成到自己的应用程序或网站中&#xff0c;使用户能够直接购买电影票。这种集成通常通过API&#xff08;应用程序编程接口&#xff09;实现。以下是电影票API接口对接的一般步骤和注意事项&#xff1a; 一般步骤&#xff1a…

Trm理论 2(Word2Vec)

神经网络模型&#xff08;NNLM&#xff09;和Word2Vec NNLM模型是上次说过的模型&#xff0c;其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

期权虚值和实值的投资风险有什么不同?

今天带你了解期权虚值和实值的投资风险有什么不同&#xff1f;首先虚值期权与实值期权在本质上有一定的区别&#xff0c;两者并不是一个概念。 期权虚值合约 虚值期权又称价外期权&#xff0c;是指不具有内在价值的期权&#xff0c;即行权价高于标的现价的认购期权或行权价低…

stm32之外部flash下载算法

文章目录 下载算法下载到芯片的核心思想算法程序中擦除操作执行流程擦除操作大致流程&#xff1a;算法程序中编程操作执行流程算法程序中校验操作执行流程 创建MDK下载算法通用流程第1步&#xff0c;使用MDK提供好的程序模板第2步&#xff0c;修改工程名第3步&#xff0c;修改使…

【unity小技巧】使用Unity的Animation Layer和Avatar Mask把多个不同动画组合使用,实现人物不同部位播放不同的动画

文章目录 前言如何使用Unity的Animation Layer和Avatar Mask把多个动画组合使用游戏角色的疲劳感是如何制作的&#xff1f;利用Animation Layers中的additive模式把多个动画混合在一起如何制作角色的受伤状态&#xff1f;Unity动画层级&#xff08;Animation Layer&#xff09;…

在stable diffussion中控制生成图片的光线

在摄影中&#xff0c;光线起着至关重要的作用&#xff0c;它对图像的整体质量和氛围有着显著的影响。您可以使用光线来增强主题&#xff0c;创造深度和维度&#xff0c;传达情感&#xff0c;以及突出重要细节。 在这篇文章中&#xff0c;我会告诉你如何在stable diffussion中控…

【C++11】深入理解与应用右值引用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目录…

webCppCluster

1.通讯协议、接口协议、数据传输格式之间的区别&#xff1f; 通讯协议 在TCP/IP四层模型中&#xff0c;四层分别是&#xff1a;应用层、传输层、网络层、网络接口层。 应用层通讯协议的代表&#xff1a;HTTP HTTPS 主要规定传输消息的具体内容、什么格式传输、是请求还是相应…

ueditorplus百度编辑器集成秀米及135编辑器

备用地址&#xff1a;ueditorplus百度编辑器集成秀米及135编辑器 下载拉取&#xff1a;ueditorplus: UEditorPlus 是基于 UEditor 二次开发的富文本编辑器&#xff0c;让 UEditor 焕然一新,已集成秀米、135编辑器&#xff0c;会不定时更新&#xff01;&#xff01;&#xff01…

MobaXterm 终端工具使用

文章目录 MobaXterm 相关介绍下载安装 MobaXterm添加 SSH 连接 MobaXterm 相关介绍 MobaXterm 是一款功能强大的终端仿真器和远程计算工具&#xff0c;专为 Windows 用户设计&#xff0c;提供了一站式解决方案&#xff0c;以便在本地和远程计算环境中工作。它结合了终端仿真、S…

C++设计模式——Chain of Responsibility职责链模式

一&#xff0c;职责链模式的定义 职责链模式&#xff0c;又被称为责任链模式&#xff0c;是一种行为型设计模式&#xff0c;它让多个对象依次处理收到的请求&#xff0c;直到处理完成为止。 职责链模式需要使用多个对象&#xff0c;其中的每个对象要么处理请求&#xff0c;要…

『功能项目』坐骑UI搭建及脚本控制显/隐【19】

本章项目成果展示 我们打开上一篇18怪物消亡掉落宝箱的项目&#xff0c; 本章要做的事情是搭建一个坐骑UI界面&#xff0c;并通过键盘B键/右侧坐骑按钮控制坐骑UI界面的显示与隐藏 在背包Bag上创建一个父物体&#xff0c; 命名为Middle 修改Bag的尺寸 将下面资源图片放进Art文…

开源|FormCreate低代码表单在弹窗中渲染表单时表单的值没有正常清空解决方法

如何在弹窗中通过低代码表单 FormCreate 渲染表单&#xff0c;包括表单的配置、表单验证、以及表单提交的处理。 源码地址: Github | Gitee <template><div><!-- 触发弹窗的按钮 --><el-button type"primary" click"showDialog true&quo…

国家商用密码算法——SM1、SM2、SM3

1、SM1 SM1 是中国国家密码管理局&#xff08;SCA&#xff09;发布的国密算法之一&#xff0c;属于对称加密算法&#xff0c;其分组长度、秘钥长度都是128bit。 【注】对称加密算法是一种使用相同密钥进行数据加密和解密的加密方式。在这种算法中&#xff0c;发送方和接收方共…