golang使用阿里云api进行中文分词

笔者刚开始学习go语言,代码有些地方不是很规范而且冗余较多,肯定不是最优的方法,但最终也实现了中文分词,但是不知道什么原因有的时候运行可能会出错,多运行几次即可。

这里我使用的是通过发送http请求来调用

主要在于签名的获取,其他的参数拼接到url上即可

代码参考的是官方签名机制文档下的python代码——签名机制

第一步:
注册阿里云账号,获取AccessKey,这里可参考官方文档API使用方法API使用方法

第二步:
先保存公共参数和api对应参数,具体参数内容可以查看文档(公共参数、API请求参数)
下面的AccessKetId和AccessKeySecret替换成自己的

 AccessKeyId := ""AccessKeySecret := ""uuid := uuid.NewV4().String()sd, _ := time.ParseDuration("-8h")timeStamp := time.Now().Add(sd).Format("2006-01-02T15:04:05Z")//准备参数param := make(map[string]string, 11)param["Format"] = "json"param["Version"] = "2020-06-29"param["AccessKeyId"] = AccessKeyIdparam["SignatureMethod"] = "HMAC-SHA1"param["Timestamp"] = timeStampparam["SignatureVersion"] = "1.0"param["SignatureNonce"] = uuidparam["ServiceCode"] = "alinlp"param["Text"] = "请输入文本"param["Action"] = "GetWsChGeneral"param["TokenizerId"] = "GENERAL_CHN"

第三步:
对参数按照key的字典序进行排序,存放在keys中

//对参数按照key排序,将key存放在keys中keys := make([]string, 0)for key := range param {keys = append(keys, key)}sort.Strings(keys)

第四步:
将key和value连接成url的形式,注意这里汉字要改成对应的十六进制编码

//将key-value转化为url的形式var url stringfor idx, key := range keys {url += (key + "=")//汉字编码if key == "Text" {for _, b := range []byte(param[key]) {url += fmt.Sprintf("%%%X", b)}} else {url += param[key]}if idx != len(keys)-1 {url += "&"}}

第五步:
对得到的url字符串进行url编码,注意这里的编码方式有所不同,可以参考签名机制的文档

 url = url2.QueryEscape(url)url = strings.Replace(url, "+", "%20", -1)url = strings.Replace(url, "*", "%2A", -1)url = strings.Replace(url, "%7E", "%~", -1)url = strings.Replace(url, "%3A", "%253A", -1)

第六步:
拼接头部

 url = "GET&%2F&" + url

至此,待签名的字符串已经完成,下面开始计算签名

第七步:
生成密钥

 secret := AccessKeySecret + "&"

第八步:
使用SHA1计算HMAC值并进行base64编码,得到最终签名

 h := hmac2.New(sha1.New, []byte (secret))h.Write([]byte(url))Signature := base64.StdEncoding.EncodeToString(h.Sum(nil))

至此,签名已得到,接下来拼接最终的url字符串发送request请求
第九步:
将Signature添加到param中,将param的key-value拼接到公有云算法的Endpoint:alinlp.cn-hangzhou.aliyuncs.com后得到最终的url

param["Signature"] = SignatureFinalurl := "http://alinlp.cn-hangzhou.aliyuncs.com/?"for key, value := range param {temp := key + "="//汉字编码if key == "Text" {for _, b := range []byte(value) {temp += fmt.Sprintf("%%%X", b)}} else {temp += value}temp += "&"Finalurl += temp}Finalurl = Finalurl[:len(Finalurl)-1]

第十步:
向最终的url发送request请求

 resp, _ := http.Get(Finalurl)defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))

执行结果

{“RequestId”:“3B3F45BB-4D3A-5ACA-A667-53DE9C31F768”,“Data”:"{“result”:[{“id”:“0”,“word”:“请”,“tags”:[“基本词-中文”]},{“id”:“1”,“word”:“输入”,“tags”:[“基本词-中文”,“产品类型修饰词”]},{“id”:“2”,“word”:“文本”,“tags”:[“基本词-中文”,“产品类型修饰词”]}],“success”:true}"}

完整代码

package mainimport (hmac2 "crypto/hmac""crypto/sha1""encoding/base64""fmt"uuid "github.com/satori/go.uuid""io/ioutil""net/http"url2 "net/url""sort""strings""time"
)func main() {AccessKeyId := "LTAI5tDFcZtdbg8bzYAZyL1S"AccessKeySecret := "QDVcavOX07bsLnGviaSTASfYBqfm3o"uuid := uuid.NewV4().String()sd, _ := time.ParseDuration("-8h")timeStamp := time.Now().Add(sd).Format("2006-01-02T15:04:05Z")//准备参数param := make(map[string]string, 11)param["Format"] = "json"param["Version"] = "2020-06-29"param["AccessKeyId"] = AccessKeyIdparam["SignatureMethod"] = "HMAC-SHA1"param["Timestamp"] = timeStampparam["SignatureVersion"] = "1.0"param["SignatureNonce"] = uuidparam["ServiceCode"] = "alinlp"param["Text"] = "请输入文本"param["Action"] = "GetWsChGeneral"param["TokenizerId"] = "GENERAL_CHN"//对参数按照key排序,将key存放在keys中keys := make([]string, 0)for key := range param {keys = append(keys, key)}sort.Strings(keys)//将key-value转化为url的形式var url stringfor idx, key := range keys {url += (key + "=")//汉字编码if key == "Text" {for _, b := range []byte(param[key]) {url += fmt.Sprintf("%%%X", b)}} else {url += param[key]}if idx != len(keys)-1 {url += "&"}}//fmt.Println(url)//url编码//然后把编码后的字符串中的加号(+)替换成 %20,星号(*)替换成 %2A,%7E替换回波浪号(~),url = url2.QueryEscape(url)url = strings.Replace(url, "+", "%20", -1)url = strings.Replace(url, "*", "%2A", -1)url = strings.Replace(url, "%7E", "%~", -1)url = strings.Replace(url, "%3A", "%253A", -1)//拼接头url = "GET&%2F&" + url//fmt.Println(url)//拼接SHA1对应的keysecret := AccessKeySecret + "&"//计算SHA1值,并做base64ddh := hmac2.New(sha1.New, []byte (secret))h.Write([]byte(url))Signature := base64.StdEncoding.EncodeToString(h.Sum(nil))//将Signature添加到参数中param["Signature"] = SignatureFinalurl := "http://alinlp.cn-hangzhou.aliyuncs.com/?"for key, value := range param {temp := key + "="//汉字编码if key == "Text" {for _, b := range []byte(value) {temp += fmt.Sprintf("%%%X", b)}} else {temp += value}temp += "&"Finalurl += temp}Finalurl = Finalurl[:len(Finalurl)-1]//发送请求resp, _ := http.Get(Finalurl)defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}

golang使用阿里云api进行中文分词相关推荐

  1. 阿里云API网关配置详解

    首先讲一下使用API网关的原因: 我想很多公司都因API或开放API的安全性感到苦恼吧,大部分公司都会自己的API进行加密处理,或token验证,可这就能防范,其他人抓取接口进行非法操作了吗?答案是肯 ...

  2. 【阿里云API】 阿里云API调用的若干说明

    阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...

  3. 2021阿里云“API满意度”调研

    简介:只需花费几分钟,即有机会获得阿里云通用代金券. 4月,"阿里云API满意度有奖征集活动"已正式启动! 只需花费几分钟,进入评分页面为"阿里云API满意度" ...

  4. 阿里云 API 签名机制的 Python 实现

    在调用阿里云 API 的时候,最让人头疼的就是 API 的签名(Signature)机制,阿里云在通用文档中也有专项说明,但是仅仅有基于 Java 的实现代码示例.所以这里基于 Python 来分析下 ...

  5. 基于Python2.7的阿里云API调用及运维相关

    基于Python2.7的阿里云API调用及运维相关 http://blog.chinaunix.net/uid-17291169-id-5212576.html 公司部分业务放在阿里云上面,虽然阿里云 ...

  6. 浅析阿里云API网关的产品架构和常见应用场景

    自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...

  7. 阿里云API网关使用教程

    API 网关(API Gateway),提供API托管服务,涵盖API发布.管理.运维.售卖的全生命周期管理.辅助用户简单.快速.低成本.低风险的实现微服务聚合.前后端分离.系统集成,向合作伙伴.开发 ...

  8. 实现调用阿里云API第二章——API调用实战(全球IP地址归属地查询)

    本篇将实现利用springboot实现阿里云API调用实战. 一.购买阿里云API https://market.aliyun.com/data?spm=5176.9502607.1387859.3. ...

  9. 阿里云Api网关导入Swagger功能简介

    广告位 Api网关通过导入Swagger文件创建和更新Api的功能已经上线了,更多帅气功能会逐步推出 Api网关目标是让您发布应用更加便捷和安全,让您更直观.便捷的管理和调试您的所有Api接口 欢迎试 ...

最新文章

  1. Static、DynamicResource学习笔记一
  2. 数据绑定以及Container.DataItem绑定技巧
  3. 印象笔记电脑版使用技巧_我的印象笔记使用手册(2020)
  4. python第一章测试题_第一章 测试【含答案】 Python大数据分析
  5. 圆弧周长公式_建筑工程施工,最常用计算公式 (大全)
  6. python绘制坐标点画出半径_24行Python代码让小球“弹”起来
  7. 研一寒假02-指针_new分配内存_使用new来创建动态数组_使用动态数组_使用delete来释放new分配的内存...
  8. 我们究竟还要学习哪些Android知识?完整版开放下载
  9. VirtualBox虚拟机 四种网络接入模式
  10. php做网页的流畅,Easying轻量流畅
  11. EJBCA 在windows上的安装
  12. selenium webdriver实战宝典 pdf_Selenium+webdriver爬虫技术实战之沃运维报表提取
  13. linux下查看mysql配置文件位置
  14. Java计算两点坐标之间的距离
  15. 微纳加工技术_工艺模块_STI 浅槽隔离
  16. “百练”成钢:NumPy 100练
  17. ESR-CMDS参数含义
  18. SDL2中文API(整理)
  19. python+cv2+pyzbar 二维码画框、角度
  20. 2022年考研计算机组成原理_4 指令系统

热门文章

  1. 【小学信息技术教资面试】《制作统计表》教案
  2. 数独游戏java版(一)--核心算法
  3. ArcMap10.8.1发布CGCS2000坐标系高程服务无法显示的解决方案
  4. hexedit(1) - Linux man page
  5. 内蒙古农业大学的计算机专业怎样,内蒙古农业大学计算机与信息工程学院
  6. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动
  7. 大学网络营销课程精简知识点
  8. CMS系统摄像机成像质量指标解析
  9. 腾讯云GPU服务器计算型GN、推理性及推理型GI3X和渲染型GN7vw性能详解
  10. 实变函数论知识点总结