一、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:

  1. 右键“此电脑” → 属性 → 高级系统设置 → 环境变量

  2. 系统变量中找到Path点击→编辑→ 新建 → 填写可执行文件所在目录

  3. 点击 确定 保存。

进入应用后,点击右上角详情->本地设置->不校验合法域名.........(不勾选的话发送请求到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;
    }
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐