Http带消息头两种请求办法

news2024/9/21 19:29:08

        API接口最近经常碰到,协调几个乙方来回对接,把我折腾晕了,索性自己写一个小的工具,导入历史数据。

获取平台免登录token

接口说明

URL Path:gateweb/bigm-dm/openApi/ologin/openLogin

说明:第三方免登录跳转到大会员平台前,要先根据用户的手机号获取对应的大会员平台的授权Token  :第三方免登录,统一用一个固定账号(生产环境用户管理中配置,提供给第三方)。关掉大会员系统的账号单点登录,保证多点登录时不冲突。

请求头HEADER

参数名称

参数说明

参数类型

是否必须

备注

appId

接入方

String

线下给

timeStamp

调起时间

String

如2022-01-01 11:11:11

sign

签名

String

通过入参结构获取签名

请求报文

格式:JSON

参数名称

参数说明

参数类型

是否必须

长度

备注

account

平台用户账户

String

070301

 

返回报文

格式:JSON

参数名称

参数说明

参数类型

是否必须

长度

备注

token

返回登录token  

String

有效用户时返回

 返回示例:

 

 

单个会员注册接口 

接口说明

API名称:gateweb/bigm-member/openApi/memInfo/regist

接口名:单个会员注册接口

说明: 用户在第三方系统中注册后,同时调大会员接口,该接口需要配置appid等数据,进行授权(会员在大会员侧注销过账号之后,第三方接口同步注册会员数据会失败,“注册失败,会员已注销!”)

请求头HEADER

参数名称

参数说明

参数类型

是否必须

备注

appId

接入方

String

线下给

timeStamp

调起时间

String

如2022-01-01 11:11:11

sign

签名

String

通过入参结构获取签名

token

登录token  

String

平台账户获取的token

请求报文

格式:JSON

参数名称

参数说明

参数类型

是否必须

长度

备注

mobileNo

手机号码

String

thirdUserId

第三方平台用户ID

String

sex

会员性别

Integer

0-未知 1-男 2-女

province

String

city

String

area

String

address

详细住址

String

company

工作单位

String

idType

证件类型

Integer

1:身份证;

只能存这一个证件类型 

idNo

证件号码

String

birthday

生日

String

yyyy-MM-dd

realName

会员姓名

String

labelCodes

会员标签

List<String>

code编码列表

branCode

机构编码

String

不填默认请求用户机构

 

返回报文

格式:JSON

参数名称

参数说明

参数类型

是否必须

长度

备注

model

操作成功

 True 成功

 返回示例

{

    "model": true,

    "success": true,

    "emptyModel": false

}

获取token代码

@Override
    public String getToken(){
        String token = "";
        SignDemoVo vo = new SignDemoVo();
        vo.setAccount( "zcl");
        String appKey = "37A64759A88374BF8B14F29CE279D598F0B092AC56A34DF173F4D77ACA3CB9D1";
        String js = JSON.toJSONString(vo);
        String sign = signWithSha256(js, appKey);
        String appId = "wxa1c28fd0e15047";

        System.out.println(" appId:" +appId +  " timeStamp:" + DateUtils.getTime() + " sign:"+  sign +  "   data:" + js);

        String apiUrl = "https://dhys.youhubei.cn/gateweb/bigm-dm/openApi/ologin/openLogin";
        String res = HttpUtils.sendPostWithHeard(apiUrl,appId,sign,"","account=zcl");

        token = JSONObject.parseObject(JSONObject.parseObject(res).getString("model")).getString("token");

        return token;
    }

调用网络请求第一个方式: 

public static String sendPostWithHeard(String url, String appId,String sign,String token,String param){
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try
        {
            log.info("sendPost - {}", url);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();

            conn.setRequestProperty("accept", "application/json");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setRequestProperty("appId",appId);
            conn.setRequestProperty("timeStamp",DateUtils.getTime());
            conn.setRequestProperty("sign",sign);
            if (StringUtils.isNotEmpty(token)){
                conn.setRequestProperty("token",token);
                log.info("token - {}", token);
            }

            conn.setDoOutput(true);
            conn.setDoInput(true);
            out = new PrintWriter(conn.getOutputStream());
            out.print(param);
            out.flush();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            String line;
            while ((line = in.readLine()) != null)
            {
                result.append(line);
            }
            log.info("recv - {}", result);
        }
        catch (ConnectException e)
        {
            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
        }
        catch (SocketTimeoutException e)
        {
            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
        }
        catch (IOException e)
        {
            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
        }
        catch (Exception e)
        {
            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            }
            catch (IOException ex)
            {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }

通用函数

@Data
    public class SignDemoVo {
        private String account;
        public void setAccount(String account) {
            this.account =account;
        }
    }

    public static String signWithSha256(String paramJson, String shaKey) {
        String signPreStr = buildSignStr(paramJson);
        return signWithSha256(signPreStr, shaKey, "UTF-8");
    }

    public static String signWithSha256(String originStr, String shaKey, String charset) {
        String text = originStr + shaKey;
        return DigestUtils.sha256Hex(getContentBytes(text, charset)).toUpperCase();
    }

    public static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:"+ charset);
        }
    }



    public static String buildSignStr(String paramJson) {
        if (StringUtils.isBlank(paramJson)) {
            return "";
        }

        com.alibaba.fastjson.JSONObject json = com.alibaba.fastjson.JSONObject.parseObject(paramJson, Feature.OrderedField);//Feature.OrderedField实现解析后保存不乱序
        Map<String, Object> params = jsonToMap(json);
        StringBuilder buf = new StringBuilder();

        Iterator<String> keys = params.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            Object value = params.get(key);
            // 判断传入kay-value中是否含有""或null
            if (value != null && value.toString().length() != 0) {
                //当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-value
                buf.append(key + "=" + value + "&");
            }
        }

        String sfStr = buf.toString();
        if (sfStr.length() > 1) {
            return sfStr.substring(0, sfStr.length() - 1);
        }
        return sfStr;
    }

    /**
     * JSON转顺序排序的Map
     *
     * @return 响应的TreeMap
     */
    public static Map<String, Object> jsonToMap(com.alibaba.fastjson.JSONObject json) {
        Map<String, Object> treeMap = new TreeMap();
        Iterator<String> keys = json.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            Object value = json.get(key);
            // value为空丢弃
            if (value == null || StringUtils.isBlank(value.toString())) {
                continue;
            }
            // 判断是否为JSONArray(json数组)
            if (value instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) value;
                List<Object> arrayList = new ArrayList<>();
                for (Object object : jsonArray) {
                    // 判断是否为JSONObject,如果是 转化成TreeMap
                    if (object instanceof com.alibaba.fastjson.JSONObject) {
                        object = jsonToMap((com.alibaba.fastjson.JSONObject) object);
                    }
                    arrayList.add(object);
                }
                treeMap.put(key, arrayList);
            } else {
                //判断该JSON中是否嵌套JSON
                boolean flag = isJSONValid(value.toString());
                if (flag) {
                    //若嵌套json了,通过递归再对嵌套的json(即子json)进行排序
                    value = jsonToMap((com.alibaba.fastjson.JSONObject) value);
                }
                // 其他基础类型直接放入treeMap
                // JSONObject可进行再次解析转换
                treeMap.put(key, value);
            }
        }
        return treeMap;
    }

    /**
     * 校验是否是JSON字符串
     *
     * @param json 传入数据
     * @return 是JSON返回true, 否则false
     */
    public final static boolean isJSONValid(String json) {
        try {
            com.alibaba.fastjson.JSONObject jo = com.alibaba.fastjson.JSONObject.parseObject(json);
            if (jo != null) {
                return true;
            }
        } catch (JSONException ex) {
            return false;
        }
        return false;
    }

第二种调用http+heard的方式(JSON)

 public int synchronizeHistoricalData(String token,TRegistrationPersonVo sendData){
        int ret = 1;
        String appKey = "37A64759A88374BF8B14F29CE279D598F0B092AC56A34DF173F4D77ACA3CB9D1";
        String js = JSON.toJSONString(sendData);
        String sign = signWithSha256(js, appKey);
        String appId = "wxa1c28fd0e15047";

        System.out.println(" appId:" +appId +  " timeStamp:" + DateUtils.getTime() + " sign:"+  sign);
        System.out.println(" token:" + token);
        System.out.println(" data:" + js);

        String apiUrlregist = "https://dhys.youhubei.cn/gateweb/bigm-member/openApi/memInfo/regist";
        String dataRes = sendJsonRequest(apiUrlregist,appId,sign,token,js);
        ret = JSONObject.parseObject(dataRes).getInteger("success");

        return ret;
    }

网络请求核心函数

/**
     * 发送 JSON 格式的 POST 请求并获取响应数据
     *
     * @param stringurl       目标 URL
     * @param requestParameter JSON 格式的请求参数字符串
     * @return 响应数据字符串
     */
    public static String sendJsonRequest(String stringurl, String appId,String sign,String token,String requestParameter) {
        try {
            // 创建 URL 对象
            URL url = new URL(stringurl);
            // 打开 HTTP 连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            // 设置请求方法为 POST
            conn.setRequestMethod("POST");
            // 设置请求头部为 JSON 格式
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("appId",appId);
            conn.setRequestProperty("timeStamp",DateUtils.getTime());
            conn.setRequestProperty("sign",sign);
            if (StringUtils.isNotEmpty(token)){
                conn.setRequestProperty("token",token);
                System.out.println("token - {}"+ token);
            }

            // 允许向服务器发送数据
            conn.setDoOutput(true);

            // 向服务器发送 JSON 数据
            OutputStream outputStream = conn.getOutputStream();
            outputStream.write(requestParameter.getBytes());
            outputStream.flush();

            // 获取响应结果
            int responseCode = conn.getResponseCode();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            StringBuffer response = new StringBuffer();
            // 读取响应数据
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();

            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

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

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

相关文章

vue2 wavesurfer.js(7.8.5)简单使用

文档地址&#xff1a;https://wavesurfer.xyz/docs/ <template><div><el-row><el-card class"card"><div id"waveform" ref"waveform"></div></el-card></el-row><div>总时长&#xff1…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

亲测可用导航网站源码分享 – 幽络源

幽络源为大家分享一套经过亲测可用的导航网站源码。初看这套PHP源码时&#xff0c;其数据库结构更像是商城系统源码&#xff0c;但经过某位小天才的修改&#xff0c;它已变成一个功能完备的导航网站。经过站长的测试&#xff0c;该源码运行良好&#xff0c;简单部署即可使用&am…

基于springboot的在线租房系统设计与实现

项目描述 这是一款基于springboot的在线租房系统 截图

438.找到字符串中所有字母异位词

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 很容易想到&#xff0c;这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。 OK&#xff0c;先思考一下怎么快速判断两个字符串是否是异位词&#xff1f; 比较简单的方法是…

AV1 Bitstream Decoding Process Specification:约定

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

ubuntu配置tftp、nfs

tftp配置 tftp是简单文件传输协议&#xff0c;基于udp实现传输。这里的简单文件&#xff0c;指的是不复杂、开销不大的文件。 先在ubuntu中安装tftp&#xff0c;输入命令&#xff1a;sudo apt-get install tftp-hpa tftpd-hpa。 接着配置tftp。 输入命令&#xff1a;sudo v…

div内英文不换行问题以及解决方案

div内英文不换行问题以及解决方案 div盒子中文字换行问题&#xff1a;div中放中文的代码&#xff1a;div中放英文的代码&#xff1a; 解决办法注意 div盒子中文字换行问题&#xff1a; div设置宽度以后&#xff0c;如果div中放的是中文&#xff0c;默认文字超过div宽度会自动换…

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断 目录 GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断分类效果格拉姆矩阵图 基本介绍程序设计参考资料 分类效果 格拉姆矩阵图 基本介绍 1.Matlab实现GAF-PCNN-Bi…

Kerberos:更安全的网络认证协议

简介 Kerberos 是一种网络认证协议&#xff0c;主要用于特定的场景下&#xff0c;代替传统的token方式&#xff0c;以一种更繁琐&#xff0c;但更安全的方式来认证用户信息。它通过票据 (ticket) 机制&#xff0c;确保用户在网络中与服务之间进行加密通信&#xff0c;并且避免…

【云备份】可视化客户端----QT开发➕QT数据库编程

文章目录 一、 需求分析二、 概念结构设计三、逻辑结构设计1. 用户表 (users)2. 客户端本地文件信息表 (upload_files)3. 备份记录表 (backup_records)4. 服务端备份文件信息表 (backup_files) 四、 开发工具五、具体实现&#xff08;一&#xff09; 客户端程序运行演示 一、 需…

7.科学计算模块Numpy(4)ndarray数组的常用操作(二)

引言 书接上回&#xff0c;numpy能作为python中最受欢迎的数据处理模块&#xff0c;脱离不了它最核心的部件——ndarray数组。那么&#xff0c;我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.掌握ndarray数组的分割 …

shader 案例学习笔记之smoothstep函数

参考&#xff1a;smoothstep 用来生成0-1的平滑过渡值 smoothstep函数源码实现&#xff1a; float smoothstep(float t1, float t2, float x) {// Scale, bias and saturate x to 0..1 rangex clamp((x - t1) / (t2 - t1), 0.0, 1.0); // Evaluate polynomialreturn x * x *…

@rem和rem用法和区别

在Windows的命令提示符&#xff08;cmd&#xff09;中&#xff0c;rem和rem都是用来注释批处理脚本的。 用法&#xff1a; rem&#xff1a;在一行的开头使用&#xff0c;注释只对当前行有效。rem&#xff1a;也在一行的开头使用&#xff0c;注释会一直持续到下一行。 区别&a…

基于SpringBoot的在线汽车租赁信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的在线汽车租赁信息…

STM32 HAL freertos零基础(五) STM32CubeMX配置完成后自定义二值信号量 解决二值信号量初始值为1问题

1、简介 通过上文虽然实现了二值信号量实战&#xff0c;但每次配置STM32CubeMX二值信号量都恢复默认值1&#xff0c;为了解决该问题&#xff0c;对于二值信号量通过CubeMX配置完成后&#xff0c;在程序内自定义二值信号量。 2、文件建立 建立BinarySem文件夹添加BinarySem.c…

Selenium自动化测试网页加载太慢如何解决(超详细)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 遇到网页加载慢&#xff0c;selenium运行效率降低&#xff0c;可以通过修改页面加载策略提升自动化效率。 selenium加载很慢 通过URL导航到新页面时&#xff0c;…

利用平板电脑和谷歌浏览器进行在线教育学习

在数字化时代&#xff0c;教育的形式越来越多样化&#xff0c;特别是在线教育的兴起为学习带来了前所未有的便利。对于经常在平板电脑上进行学习的用户来说&#xff0c;谷歌浏览器提供了强大的功能&#xff0c;帮助用户更有效地学习。本文将指导您如何在使用平板电脑和谷歌浏览…

系统工程建模MBSE

################################# ############# 片段一 ############## ################################# 下图采用“V”模式显示了集成的基于模型的系统/嵌入式软件开发流程Harmony。左侧描述了自顶向下的设计流程,而右侧显示了自底而上的从单元测试到最终系统验收测试…

‌语音控制小夜灯的实现方案介绍

‌语音控制小夜灯的实现方案组成部分‌ 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。‌ ‌硬件组装‌涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先&#xff0c;使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处&#xff0c;同时将语音声控模…