CKafka系列学习文章 - 手动拼接和自动拼接请求URL(十)

2019-11-22 10:47:18 浏览数 (1)

导语:我们来搭建开发环境调用消息队列 CKafka--手动拼接和自动拼接请求URL,来调用获取消费分组offset的接口

一、 接口描述

接口请求域名:ckafka.api.zijiebao.com 本接口(GetGroupOffsets)用于在用户账户下获取 CKafka 消息分组 offset。

二、输入参数

以下请求参数列表仅列出了接口请求参数,其它参数见 公共请求参数 页面。

参数名称

是否必选

类型

描述

instanceId

String

(过滤条件)按照实例 ID 过滤

group

String

Kafka 消费分组

topics

String Array

group 订阅的主题名称数组,如果没有该数组,则表示指定的 group 下所有 topic 信息

searchWord

String

模糊匹配 topicName

offset

Int

本次查询的偏移位置,默认为0

limit

Int

本次返回结果的最大个数,默认为50,最大值为50

注:下面签名只用了instanceId和group参数

三、公共请求参数

参数名称

描述

类型

必选

Action

具体操作的指令接口名称,例如腾讯云 CVM 用户调用 查询实例列表接口,则 Action 参数即为 DescribeInstances。

String

Region

地域参数,用来标识希望操作哪个地域的实例。详细信息可参见 地域和可用区 列表,或使用 查询地域列表 API 接口查看。 注意:1. 正常情况下此参数是必须的,如无需传入,则会在相应接口中进行说明。 2. 部分区域正在内测中,目前仅面向部分用户开放。

String

Timestamp

当前 UNIX 时间戳,可记录发起 API 请求的时间。

UInt

Nonce

用户可自定义随机正整数,与 Timestamp 联合起来, 用于防止重放攻击。

UInt

SecretId

在 云API密钥 上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey , 而 SecretKey 会用来生成请求签名 Signature。具体可参考 签名方法 章节。

String

Signature

请求签名,用来验证此次请求的合法性,需要用户根据实际的输入参数计算得出。计算方法可参考 签名方法 章节。

String

SignatureMethod

签名方式,目前支持 HmacSHA256 和 HmacSHA1。只有指定此参数为 HmacSHA256 时,才使用 HmacSHA256 算法验证签名,其他情况均使用 HmacSHA1 验证签名。详细签名计算方法可参考 签名方法 章节。

String

Token

临时证书所用的 Token,需要结合临时密钥一起使用。长期密钥不需要 Token。

String

注:下面签名只有Token没用,Signature是最后加到请求url。

四、调用方式

腾讯云 API 会对每个访问的请求进行身份验证,即每个请求都需要在公共请求参数中包含签名信息(Signature),以验证用户身份。签名信息由用户所执有的安全凭证生成,安全凭证包括 SecretId 和 SecretKey,若用户还没有安全凭证,则需要在腾讯云官网上自主申请,否则无法调用云 API 接口。

签名方法

1、准备工作

SecretId:AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx

SecretKey:WmmW0wd4E8nCKEPM3Zpqb7PUKvHxxxxx

获取当前时间戳

https://tool.lu/timestamp

2、对参数排序

(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z)

"Action":"GetGroupOffsets"

"Nonce":"1567669377"

"Region":"ap-guangzhou"

"SecretId":"AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx"

"SignatureMethod":"HmacSHA256"

"Timestamp":"1567669377"

"group":"console-consumer-2529"

"instanceId":"ckafka-3vekvxxx"

3、拼接请求字符串

Action=GetGroupOffsets

&Nonce=1567669377

&Region=ap-guangzhou

&SecretId=AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx

&SignatureMethod=HmacSHA256

&Timestamp=1567669377

&group=console-consumer-2529

&instanceId=ckafka-3vekvxxx

4、拼接签名原文字符串(GET或POST)

GETckafka.api.zijiebao.com/v2/index.php?Action=GetGroupOffsets&Nonce=1567671719&Region=ap-guangzhou&SecretId=AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx&SignatureMethod=HmacSHA256&Timestamp=1567671719&group=console-consumer-2529&instanceId=ckafka-3vekvxxx

5、生成签名串

$secretKey = 'WmmW0wd4E8nCKEPM3Zpqb7xxxxxxxxxxx';

$srcStr = 'GETckafka.api.zijiebao.com/v2/index.php?Action=GetGroupOffsets&Nonce=1567673666&Region=ap-guangzhou&SecretId=AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx&SignatureMethod=HmacSHA256&Timestamp=1567673666&group=console-consumer-2529&instanceId=ckafka-3vekvxxx';

$signStr = base64_encode(hash_hmac('sha256', $srcStr, $secretKey, true));

echo $signStr;

签名串:

t/NnKgbvxXpZuXeRXeKZPBhVVbustIqHuLj7jvxxxxx=

6、URL编码

7、签名串请求参数

t/NnKgbvxXpZuXeRXeKZPBhVVbustIqHuLj7jvxxxxx=

8、拼接请求url并执行

curl "https://ckafka.api.zijiebao.com/v2/index.php?Action=GetGroupOffsets&Nonce=1567673666&Region=ap-guangzhou&SecretId=AKIDKTM0OYJ6SaaKnyqZx5wYx61hANJxxxxx&SignatureMethod=HmacSHA256&Timestamp=1567673666&group=console-consumer-2529&instanceId=ckafka-3vekvxxx&Signature=t/NnKgbvxXpZuXeRXeKZPBhVVbustIqHuLj7jvxxxxx="

五. 自动生成请求url

要选择API2.0签名,填写Secretld和SecretKey要选择API2.0签名,填写Secretld和SecretKey
选择请求方法、加密方法和填写域名选择请求方法、加密方法和填写域名
填写接口名、地域和请求参数填写接口名、地域和请求参数
提交即可生成请求Curl命令提交即可生成请求Curl命令

POST:

GET:

六、 接口调用返回的错误码

https://cloud.tencent.com/document/product/597/10090

七、调用Ckafka接口用到的SDK

https://mvnrepository.com/artifact/com.tencentcloudapi/tencentcloud-sdk-java/3.0.58

八 、 调用URL

代码语言:javascript复制

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class ToInterface {
      
    public static void main(String[] args) {
        String str =sendGet("https://ckafka.api.zijiebao.com/v2/index.php", "Action=GetGroupOffsets&Nonce=1567680660&Region=ap-guangzhou&SecretId=AKIDKTM0OYJ6SaaKnyqZx5wYx61hxxxxxXP2&SignatureMethod=HmacSHA256&Timestamp=1567680660&group=console-consumer-2529&instanceId=ckafka-3vekvxxx&Signature=+dyj+/UoG58HJwHyhzoZGcbjwQiScJhLqxxxxxx96jo=");
    	System.out.println(str);
    }
    /**
     * 向指定URL发送GET方法的请求
     * 
     * @param url
     *            发送请求的URL
     * @param param
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url   "?"   param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key   "--->"   map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result  = line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!"   e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }
}

执行结果:

代码语言:javascript复制
Transfer-Encoding--->[chunked]
null--->[HTTP/1.1 200 OK]
Server--->[nginx]
Connection--->[close]
Vary--->[Accept-Encoding]
Date--->[Thu, 05 Sep 2019 12:25:58 GMT]
Content-Type--->[text/html; charset=utf-8]
{"code":0,"message":"","codeDesc":"Success","data":{"totalCount":1,"topicList":[{"topic":"topic_test1","partitions":[{"partition":0,"offset":349344,"meta":null,"errCode":0,"logEndOffset":349415,"lag":71}]}]}}

0 人点赞