0.最下方有完整代碼
1.需求
最近接了新的任務(wù)梯刚,要用go把其他部門的python的接口接過來,那么開始吧
2.目前持有的條件
a.go剛開始看
b.接口沒有文檔雄嚣,只有python的代碼若皱,python咱也不會(并不驕傲)
那么開始吧
3.開始實(shí)現(xiàn)
a.搜索go的http請求是怎么進(jìn)行的
然后發(fā)現(xiàn)可以直接使用http的api進(jìn)行post請求兔港,如下方法
// 進(jìn)行請求
reqest, err := http.PostForm(my_url, url.Values{"Text": {"你好"}})
// 設(shè)置請求頭
reqest.Header.Set("Content-Type", "application/json")
reqest.Header.Set("Ocp-Apim-Subscription-Key", key)
但是這樣請求的話header是沒有地方設(shè)置的,因?yàn)樵诘谝恍芯鸵呀?jīng)開始請求了蓄氧,但是請求之后才返回request疟位,再設(shè)置header為時(shí)已晚。這里不知道是不是我剛開始寫go版扩,還不知道具體的使用方法废离,還是說這樣請求的話就是無法設(shè)置header。
結(jié)論:所以這種方式pass
b.還有一種寫法是用client
client := &http.Client{
Timeout: time.Second * 2,
}
req, err := http.NewRequest("POST", uri, r)
if err != nil {
fmt.Printf("Error creating request: %v\n", err)
return
}
// 設(shè)置header
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Content-Length", strconv.FormatInt(req.ContentLength, 10))
req.Header.Add("Ocp-Apim-Subscription-Key", subscriptionKey)
// 在這里開始進(jìn)行請求
resp, err := client.Do(req)
這種方法可以在設(shè)置好頭部之后再進(jìn)行請求礁芦,所以我們使用這種方法蜻韭。
c.開始傳參
關(guān)于傳參的方法,網(wǎng)上搜出來的五花八門柿扣,就是不能用肖方,也是非常的服氣了,看到的帖子都是互相抄的未状,也是很無語窥妇。
我這里請求的服務(wù)器地址有微軟的和谷歌的,參數(shù)要求都是json格式娩践,但是很神奇的活翩,參數(shù)結(jié)構(gòu)卻不一樣烹骨,這個(gè)還是在我反復(fù)試驗(yàn)之后,蒙對的材泄,沒有文檔真的舉步維艱
const params = "&to=zh-Hans&from=en"
const uri = uriBase + uriPath + params
fmt.Println(uri)
const text = "Hello, nice to meet you!"
r := strings.NewReader("[{\"Text\" : \"" + text + "\"}]")
client := &http.Client{
Timeout: time.Second * 2,
}
req, err := http.NewRequest("POST", uri, r)
if err != nil {
fmt.Printf("Error creating request: %v\n", err)
return
}
這個(gè)是訪問微軟接口時(shí)的傳參方式沮焕,strings.NewReader里面就是參數(shù)的body,但是兩邊竟然是數(shù)組的格式拉宗,也是神奇了峦树,所以就一直訪問通,報(bào)的錯誤各種各樣旦事,有說沒有權(quán)限訪問的魁巩,有說key傳的不對的,有說json的不可用的姐浮,最后一個(gè)提示是對的谷遂,但是我并不知道json的格式還需要兩邊加[],真的沒見過卖鲤。
后來這么寫之后終于算是通了
d.換接口傳參
微軟的接口通了之后肾扰,再接谷歌的接口應(yīng)該就是換個(gè)參數(shù)的事,想著應(yīng)該沒什么坑了蛋逾,可是不然集晚。
谷歌的格式是這樣的
r := strings.NewReader("{\"q\" : \"" + text + "\", \"source\" : \"" + source + "\", \"target\" : \"" + target + "\", \"model\" : \"" + model + "\"}")
這種是我們傳統(tǒng)認(rèn)為的json格式。
至此区匣,兩個(gè)接口就都通了偷拔。
4.完整代碼
就以谷歌的為例,參數(shù)還多一些
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
)
func main9() {
// Replace the subscriptionKey string value with your valid subscription key
const subscriptionKey = "keykeykeykeykey"
const uriBase = "https://xxxxx.googleapis.com"
const uriPath = "/aaaa/bbbb/v2"
// Translate to German and Italian
const params = "?key=" + subscriptionKey
const uri = uriBase + uriPath + params
fmt.Println(uri)
const text = "Hello, i am google service!"
source := "en"
target := "zh-Hans"
model := "nmt"
r := strings.NewReader("{\"q\" : \"" + text + "\", \"source\" : \"" + source + "\", \"target\" : \"" + target + "\", \"model\" : \"" + model + "\"}")
client := &http.Client{
Timeout: time.Second * 2,
}
req, err := http.NewRequest("POST", uri, r)
if err != nil {
fmt.Printf("Error creating request: %v\n", err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("Error on request: %v\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("Error reading response body: %v\n", err)
return
}
var f interface{}
json.Unmarshal(body, &f)
jsonFormatted, err := json.MarshalIndent(f, "", " ")
if err != nil {
fmt.Printf("Error producing JSON: %v\n", err)
return
}
fmt.Println(string(jsonFormatted))
}