首页 > 其他分享 >讯飞开放平台机器翻译(新)golang实现demo

讯飞开放平台机器翻译(新)golang实现demo

时间:2023-05-24 13:23:11浏览次数:36  
标签:map string demo request 机器翻译 golang host signatureStr interface

最近做项目用到翻译功能,对接了一下科大讯飞的翻译api接口,demo如下:

package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
	"strings"
)

const (
	Host      = "itrans.xf-yun.com"
	Algorithm = "hmac-sha256"
	HttpProto = "HTTP/1.1"
	Uri       = "/v1/its"
	Url       = "https://itrans.xf-yun.com/v1/its"
	AppId  = "your app_id"
	AppSecret = "your app_secret"
	AppKey = "your app_key"
	Text   = "今天天气怎么样" //需要翻译的文本
)

func main() {
	client := &http.Client{}
	//生成要访问的url
	// 请求时间
	currentTime := time.Now().UTC().Format(time.RFC1123)
	// 生成签名
	sign := generateSignature(Host, currentTime, "POST", Uri, HttpProto, AppSecret)
	// 组装信息
	authInfo := fmt.Sprintf(`api_key="%s",algorithm="%s",headers="host date request-line",signature="%s"`,AppKey, Algorithm, sign)
	// 拼装请求body信息
	requestParam := map[string]interface{}{
		"header": map[string]interface{}{
			"app_id": AppId,
			"status": 3,
		},
		"parameter": map[string]interface{}{
			"its": map[string]interface{}{
				"from": "cn",
				"to":   "en",
				"result": map[string]interface{}{},
			},
		},
		"payload": map[string]interface{}{
			"input_data": map[string]interface{}{
				"encoding": "utf8",
				"status":   3,
				"text":     base64.StdEncoding.EncodeToString([]byte(Text)),
			},
		},
	}
	// 请求信息
	jsonByte, _ := json.Marshal(requestParam)
	request, err := http.NewRequest("POST", Url, strings.NewReader(string(jsonByte)))
	if err != nil {
		panic(err)
	}
	q := request.URL.Query()
	q.Add("host", Host)
	q.Add("date", currentTime)
	q.Add("authorization", base64.StdEncoding.EncodeToString([]byte(authInfo)))
	request.URL.RawQuery = q.Encode()
	request.Header.Set("content-type", "application/json")

	//处理返回结果
	response, _ := client.Do(request)
	defer response.Body.Close()
	body, err := ioutil.ReadAll(response.Body)
	fmt.Println(string(body))
}

func generateSignature(host, date, httpMethod, requestUri, httpProto, secret string) string {
	var signatureStr string
	if len(host) != 0 {
		signatureStr = "host: " + host + "\n"
	}
	signatureStr += "date: " + date + "\n"
	signatureStr += httpMethod + " " + requestUri + " " + httpProto
	return hmacsign(signatureStr, secret)
}
func hmacsign(data, secret string) string {
	mac := hmac.New(sha256.New, []byte(secret))
	mac.Write([]byte(data))
	encodeData := mac.Sum(nil)
	return base64.StdEncoding.EncodeToString(encodeData)
}

标签:map,string,demo,request,机器翻译,golang,host,signatureStr,interface
From: https://www.cnblogs.com/xingzr/p/17428016.html

相关文章

  • golang使用小技巧
    封装gorouting并捕捉panic从k8s源码中学到的,觉得小而精,感觉比定时器好用呢k8s源码中是这样使用的//每隔peroid后就执行传入的函数funcForever(ffunc(),periodtime.Duration){ for{ func(){ deferHandleCrash()//捕捉函数中的panic f() }() time.Sleep(per......
  • 微服务框架SpringCloud微-2-服务拆分及远程调用-demo黑马
    微服务框架SpringCloud微服务架构2服务拆分及远程调用2.1案例Demo2.1.1服务拆分注意事项 这里四个模块,拆成四个服务就行了 单一职责:不同微服务,不要重复开发相同业务【不能像以前那样了】数据独立:不要访问其它微服务的数据库 3.面向服务:将自己的业务暴......
  • Golang - 获取指定区间范围内随机数
    1.go语言未提供获取指定区间范围内的随机数方法,只有一个参数获取(0,n)的随机数。2.可根据此方法获取指定区间随机数,先随机0到(m-n),再用加 n的方式解决例:[5,10],先生成[0,5],再加5packagemainimport("fmt""math/rand""time")funcmain(){//......
  • golang context 应用
    packagemainimport( "context" "fmt" "time")funcmain(){ //创建初始上下文 ctx:=context.Background() //派生可取消的上下文 cancelCtx,cancel:=context.WithCancel(ctx) //启动一个Goroutine执行任务 godoTask(cancelCtx) //等待一段时......
  • golang new和make
    new和make1.new和make都用于分配内存;2.new对指针类型分配内存,返回值是分配类型的指针,new也可以对slice、map、channel分配内存;但多用于自定义的结构体3.make仅用于slice、map和channel类型的初始化分配内存空间,返回值为类型本身,而不是指针;4、new分配的返回的时......
  • Golang的viper包调用多次OnConfigChange
    问题:修改了一次,而执行了两次这个函数解决方案把配置文件进行md5,保存其md5值。在调用这个函数时,再次读取文件进行md5。两者比对,如果相等就不执行下面的逻辑。这样就解决了,一模一样的配置文件,保存多次,不会执行后续的逻辑。但是,杜绝了大部分的场景,比如修改了一次,保存了两次......
  • golang操作redis
    首先,基于docker查看redis镜像dockerps-a然后执行dockerrun-p6379:6379-dredis:latestredis-server,将端口映射到本机最后执行dockerexec-ti13e638ea1036redis-cli-h0.0.0.0-p6379执行链接操作......
  • Field userClient in com.demo.order.service.OrderService required a bean of type'
    在SpringCloud项目中使用Feign进行远程调用遇到的错误。原因是因为UserClient在com.demo.feign.clients包下面,而order-service的@EnableFeignClientd注解却在com.demo.order包下面,这两个不在同一个包下,无法扫描到UserClient。解决方法有两种1.指定Feign应该扫描的包@EnableFeig......
  • golang采坑
    2023年4月8日12:00:28选择golang开发的几个理由语法简单,类C语法,但是又不是全c风格,刚开始会有些不适应部署简单,直接编译成二进制文件,直接部署高性能,很多互联网项目需要考虑的近些年,go的社区基金会都是大厂,未来发展问题不大国内外很多项目开始采用go重写java,php,python等,需要......
  • golang命令行cobra 快速入门教程
    cobra也许是go语言现有最好的命令行框架了,在各大项目中皆有使用,比如最出名的kubernetes,所以要写一个稍微复杂的命令行工具,使用cobra还是不错的,cobra内置了非常多有用的功能,包括但不限于,自动生成帮助文档,生成命令行代码的脚手架工具,智能提示等等。命令行相关知识在学习cobr......