go的http請求和傳參的坑

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))
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亏钩,一起剝皮案震驚了整個(gè)濱河市莲绰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铸屉,老刑警劉巖钉蒲,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切端,死亡現(xiàn)場離奇詭異彻坛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踏枣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門昌屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茵瀑,你說我怎么就攤上這事间驮。” “怎么了马昨?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵竞帽,是天一觀的道長扛施。 經(jīng)常有香客問我,道長屹篓,這世上最難降的妖魔是什么疙渣? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堆巧,結(jié)果婚禮上妄荔,老公的妹妹穿的比我還像新娘。我一直安慰自己谍肤,他們只是感情好啦租,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荒揣,像睡著了一般篷角。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乳附,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天内地,我揣著相機(jī)與錄音,去河邊找鬼赋除。 笑死阱缓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的举农。 我是一名探鬼主播荆针,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颁糟!你這毒婦竟也來了航背?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棱貌,失蹤者是張志新(化名)和其女友劉穎玖媚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婚脱,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡今魔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了障贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错森。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖篮洁,靈堂內(nèi)的尸體忽然破棺而出涩维,到底是詐尸還是另有隱情,我是刑警寧澤袁波,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布瓦阐,位于F島的核電站蜗侈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睡蟋。R本人自食惡果不足惜宛篇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薄湿。 院中可真熱鬧叫倍,春花似錦、人聲如沸豺瘤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坐求。三九已至蚕泽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桥嗤,已是汗流浹背须妻。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泛领,地道東北人荒吏。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像渊鞋,于是被迫代替她去往敵國和親绰更。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容