背景
客戶端通過https請求訪問服務(wù)端阁猜,校驗服務(wù)端body返回值必須 =="OK",滿足=="OK"業(yè)務(wù)能正常運行雷滚,否則異常
server端:
b, _ := json.Marshal("OK")
c.Ctx.Output.Body(b)
client端:
respBody, _ := ioutil.ReadAll(resp.Body)
content:=string(respBody)
if content == "OK" {
... //success
}
調(diào)試中發(fā)現(xiàn)死活進不到content == "OK"
的判斷,將content的值print出來也為"OK",但就是進不到相等的判斷分支篮迎,導(dǎo)致業(yè)務(wù)一直異常,摸索半天后發(fā)現(xiàn)是string和byte[]轉(zhuǎn)換的問題檀训,后將server端修改如下柑潦,終于運行正常
var bytesOK = []byte("OK")
c.Ctx.Output.Body(bytesOK)
結(jié)論
string和byte[] 轉(zhuǎn)換,需要匹配
- Marshal 匹配 Unmarshal
- []byte("OK") 匹配 string(bytesOK)
- string 轉(zhuǎn)為byte[]峻凫,Marshal 會比 []byte("OK") 方式前后各多一個 "(ASCII 34)
測試demo源碼:
package main
import (
"encoding/json"
"fmt"
)
func main() {
var bytesOK = []byte("OK")
marshalBytesOK, _ := json.Marshal("OK")
fmt.Println("bytesOK:", bytesOK)
fmt.Println("marshalBytesOK:", marshalBytesOK)
ok1 := string(bytesOK)
fmt.Println("ok1:", ok1)
fmt.Println("is ok1 == OK:", ok1 == "OK")
ok2 := string(marshalBytesOK)
fmt.Println("ok2:", ok2)
fmt.Println("is ok2 == OK:", ok2 == "OK")
var ok3 string
json.Unmarshal(marshalBytesOK, &ok3)
fmt.Println("ok3:", ok3)
fmt.Println("is ok3 == OK:", ok3 == "OK")
}
輸出如下:
bytesOK: [79 75]
marshalBytesOK: [34 79 75 34]
ok1: OK
is ok1 == OK: true
ok2: "OK"
is ok2 == OK: false
ok3: OK
is ok3 == OK: true