文档章节

青云 SDK Go Version (兼容官方 SDK)

chai2010
 chai2010
发布于 2017/09/10 11:52
字数 958
阅读 25
收藏 0
点赞 0
评论 0

项目地址:

项目目标:

  • 基于 Protobuf-V3 语法维护规范, 便于升级和维护
  • 更完整的服务支持, 新服务第一时间提供支持
  • 更好用的编程接口

在线文档:

接口规范:

配置文件

当前用户的配置文件在 ${HOME}/.qingcloud/config.yaml, 内容如下:

# QingCloud services configuration

qy_access_key_id: 'ACCESS_KEY_ID'
qy_secret_access_key: 'SECRET_ACCESS_KEY'

host: 'api.qingcloud.com'
port: 443
protocol: 'https'
uri: '/iaas'
connection_retries: 3

json_disable_unknown_fields: false

# Valid log levels are "debug", "info", "warn", "error", and "fatal".
log_level: 'warn'

qy_access_key_idqy_secret_access_key 字段替换为 API密钥 中的内容.

其中 json_disable_unknown_fields 是新加的变量, 表示在JSON解码时忽略 proto.Message 遇到未定义成员的错误.

快速入门

以下为 hello.go 的内容:

package main

import (
	"fmt"
	"log"

	"github.com/chai2010/qingcloud-go/config"
	pb "github.com/chai2010/qingcloud-go/service"
	"github.com/golang/protobuf/jsonpb"
	"github.com/golang/protobuf/proto"
)

func main() {
	// 初始化 青云 服务对象
	qcService, err := pb.Init(config.MustLoadUserConfig())
	if err != nil {
		log.Fatal(err)
	}

	// 返回 NIC 子服务, pek3a 为 北京3区-A
	nicService, err := qcService.Nic("pek3a")
	if err != nil {
		log.Fatal(err)
	}

	// 列出所有网卡
	reply, err := nicService.DescribeNics(nil)
	if err != nil {
		log.Fatal(err)
	}

	// 原始返回的json数据
	// nicService.LastResponseBody

	// JSON 格式打印
	fmt.Println(jsonpbEncode(reply))
}

// pb转json, 采用原始名称, 不忽略空值
func jsonpbEncode(m proto.Message) string {
	jsonMarshaler := &jsonpb.Marshaler{
		OrigName:     true,
		EnumsAsInts:  true,
		EmitDefaults: true,
		Indent:       "  ",
	}
	s, err := jsonMarshaler.MarshalToString(m)
	if err != nil {
		log.Fatal(err)
	}
	return s
}

初始化子服务也可以用以下方式:

nicService := pb.NewNicService(config.MustLoadUserConfig(), "pek3a")

运行例子:

go run hello.go

更多例子.

文档指南

使用青云SDK一般是以下步骤:

  1. config 包构造一个配置对象, 里面含有最重要的 API密钥, 还包含日志级别等信息.
  2. 基于配置对象调用 service 包的 Init 函数构造一个青云主服务对象 qcService, 其中会根据配置文件设置日志级别.
  3. 假设有一个 UserData 子服务, 那么调用 qcService.UserData("pek3a") 方法将返回子服务对象, 其中参数是区域
  4. 使用子服务对象就可以调用每个子对象的方法了

我们可以查看子服务对应的接口规范, 在 spec.pb/user_data.proto 文件定义 (青云文档):

service UserDataService {
	rpc UploadUserDataAttachment(UploadUserDataAttachmentInput) returns (UploadUserDataAttachmentOutput);
}

message UploadUserDataAttachmentInput {
	bytes attachment_content = 2;
	string attachment_name = 1;
}

message UploadUserDataAttachmentOutput {
	string action = 1;
	int32 ret_code = 2;
	string message = 3;

	string attachment_id = 4;
}

其中service关键字开头的表示定义一组子服务, 其中rpc开头的表示子服务中每个具体的方法. 方法的输入参数和返回值分别为UploadUserDataAttachmentInputUploadUserDataAttachmentInput结构体类型, 它们由后面的message关键字定义.

SDK的代码生成插件 会生成以下的Go语言代码:

type UserDataService struct {
	// ...
}

func (p *QingCloudService) UserData(zone string) (*UserDataService, error) {
	// ...
}

type UploadUserDataAttachmentInput struct {
	// ...
}
type UploadUserDataAttachmentOutput struct {
	// ...
}

func (p *UserDataService) UploadUserDataAttachment(
	in *UploadUserDataAttachmentInput,
) (
	*UploadUserDataAttachmentOutput,
	error,
) {
	// ...
}

规范文件的语法细节可以参考 spec.pb/README.md, proto3 文件语法可以参考 Protobuf 的官方文档.

与官方文档的兼容性

  • 该 SDK 和 官方 SDK 的 API 保持最大的兼容性
  • 即使有不兼容的地方, API 也是非常相似的

假设青云的REST规范的文档中有一个名为 job_id 的输入参数, 对应 XXXInput 结构体的成员.

官方文档是根据 json定义的规范, 然后通过一个名为 snips 的工具加自己定义的 模板 生成的代码, XXXInput 输入参数生成的代码可能类似以下结构:

type XXXInput struct {
	JobID *string `json:"job_id" name:"job_id" location:"elements"`
}

而我们的SDK采用Protobuf3标准工具生成的代码:

type XXXInput struct {
	JobId string   `protobuf:"bytes,5,opt,name=job_id,json=jobId" json:"job_id,omitempty"`
}

其中有两个大的差异: 一个是成员名称不同, 分别为 JobIDJobId; 另一个为类型不同, 分别为 *stringstring.

snips 采用和 Protobuf-V2 类似的生成规则, 零值是 nil, 空值是空字符串, 二者是不等价的. 在 Protobuf3 的生成规则中, 默认将零值和空值等价.

© 著作权归作者所有

共有 人打赏支持
chai2010

chai2010

粉丝 413
博文 98
码字总数 81391
作品 8
武汉
程序员
chai2010/qingcloud-go

青云 SDK Go Version 新开 SDK 的原因: 官方 SDK 迟迟没有 release, 项目活跃度较低 官方 SDK 的 近2万行手写的json 维护极其困难, 已经失去继续进化的可能 官方 SDK 需要用 Go 语言的模板语...

chai2010 ⋅ 2017/11/17 ⋅ 0

蓝牙 Nordic nrf51822 评估板 入门

参考: 青云蓝牙光盘V4.17.青云开发板原理图青云蓝牙nrf51822开发板.pdf 青云蓝牙光盘V4.16.青云系列教程青风出品1:前期预备篇:如何开发nrf51822硬件篇:QY-NRF51822硬件详解.pdf 青云蓝牙...

wowocpp ⋅ 05/07 ⋅ 0

AndroidManifest.xml注意事项

一、target SDK version Android Runtime和Dalvik会根据target SDK version决定是否工作在『兼容模式』下,所谓兼容模式,就是关闭了新版本中各种新机制和体验优化的状态。targetSdkVersion如...

今日竹石 ⋅ 2014/04/09 ⋅ 0

AndroidManifest.xml注意事项

一、target SDK version Android Runtime和Dalvik会根据target SDK version决定是否工作在『兼容模式』下,所谓兼容模式,就是关闭了新版本中各种新机制和体验优化的状态。targetSdkVersion如...

今日竹石 ⋅ 2014/03/12 ⋅ 1

关于微信js分享接口的一些使用心得

虽然微信官方开放了js-sdk,但是在某些老版本的微信上存在兼容性问题,比如在安卓微信6.0.1版本上分享接口就无法使用,官方给出的解决方案就是升级微信。这不坑爹呢!我又不能强制我的用户去...

吾爱 ⋅ 2015/01/21 ⋅ 6

QingStor™ 对象存储新增 6 种语言 SDK

为了让更多的用户能够快速便捷的使用 QingStor™ 对象存储服务,我们在原有 Python SDK 的基础上,新增 Go、Ruby、Swift、Java、JavaScript 及 PHP, 6 种语言的 SDK。 目前 QingStor™ 对...

两味真火 ⋅ 2016/12/15 ⋅ 2

去除AndroidManifest.xml uses-sdk警告方法

我们经常在开发app的时候在AndroidManifest.xml发现这个警告warining:"Not targeting the latest versions of Android; compatibility modes apply. Consider testing and updating this ver......

红豆与绿豆 ⋅ 2015/11/16 ⋅ 0

ubuntu装android sdk

Android SDK中的adb程序是32位的,Ubuntu x64系统需要安装32位库文件,才能兼容32位的程序。如果不安装,adb会出错:java.io.IOException: error=2 sudo apt-get install -y libc6-i386 lib...

骑牛找牛 ⋅ 2014/02/18 ⋅ 0

Android Version

1、 2、minSdkversion和targetSdkVersion相信很多人都不太理解,我在网上也看了许多关于这两者区别的文章,感觉说的都很模糊,直到我在stackOverFlow看到android Min SDK Version vs. Targe...

当空皓月 ⋅ 2016/12/20 ⋅ 0

【随手记】ActionBar Action Items not showing 菜单项无法显示

此问题的stackoverflow版本 http://stackoverflow.com/questions/17913084/actionbar-action-items-not-showing 我的sdk version设置如下: <uses-sdk android:minSdkVersion="8" android:ta......

zerobyte ⋅ 2014/04/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 12分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 16分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 21分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 22分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 32分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 54分钟前 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 57分钟前 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 59分钟前 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部