反序列化AWS/阿里云样式的基于Query的API请求
对于比较了解云计算的人来说,一定接触过AWS、阿里云的API接口,这两者的API调用方式很相似,当然具体谁参考谁这里就不深究了。以给EC2/ECS添加Tag这个接口为例:
AWS:
https://ec2.amazonaws.com/?Action=CreateTags&ResourceId.1=ami-1a2b3c4d&ResourceId.2=i-1234567890abcdef0&Tag.1.Key=webserver&Tag.1.Value=&Tag.2.Key=stack&Tag.2.Value=Production&AUTHPARAMS阿里云:
https://ecs.aliyuncs.com/?Action=TagResources&RegionId=cn-hangzhou&ResourceId.1=i-bp1j6qtvdm8w0z1o0****&ResourceId.2=i-bp1j6qtvdm8w0z1oP****&ResourceType=instance&Tag.1.Key=TestKey&Tag.1.Value=TestKey&<公共请求参数>这种样式的接口设计,其实没有什么复杂的,相对比较特殊的地方在于,如果需要传入一个数组,则需要使用类似下标一样的Tag.N.Key这种格式进行传递,这个传递方式,和已有的一些诸如google/go-querystring的传递方式都不太相同,总之是个很特殊的设计。
如果需要写一个类似的服务,使用和这两家相同的API格式的话,针对这种数组格式的请求反序列化是个挺麻烦的事,而且找了一圈也没有类似的开源项目做这个。
今天借助ChatGPT写了一个反序列化函数,专门用来实现服务端对类似形态API的反序列化,通过这个函数可以很方便的将Query反序列化成一个对应的Struct:
package mainimport ("encoding/json""fmt""net/url""reflect""strconv""strings")type TagRequest struct {Action string `query:"Action"`RegionID string `query:"RegionId"`ResourceIds []string `query:"ResourceId"`ResourceType string `query:"ResourceType"`Tags []Tag `query:"Tag"`}type Tag struct {Key string `query:"Key"`Value string `query:"Value"`}func Unmarshal(queryStr string, output interface{}) error {values, err :=...剩余内容已隐藏