在制作游戏服务器的时候,登录验证操作的时候,需要发起post请求给web服务器,来完成对于登录的校验。这篇文章记录一下使用golang常用的一些操作,方便今后需要的时候查阅。对于关于如何打包post,查看考了stackoverflow1。
用json方式 post
讲数据打包成json
func (this *User) calcJson(cfg *Cfg) *bytes.Buffer {
kvPairs := make(map[string]string)
kvPairs["packageId"] = fmt.Sprintf("%d", cfg.PackageId)
kvPairs["thirdUserId"] = fmt.Sprintf("%d", this.userId)
kvPairs["token"] = this.token
kvPairs["exInfo"] = this.exInfo
kvPairs["sign"] = this.calcMd5(cfg)
postJson, err := json.Marshal(kvPairs)
if err != nil {
logrus.Warnf("testLogin err: %v", err.Error())
return nil
}
logrus.Debugf("postJson %v", string(postJson))
return bytes.NewBuffer(postJson)
}
计算md5字符串
func (this *User) calcMd5(cfg *Cfg) string {
w := md5.New()
var buffer bytes.Buffer
buffer.Write([]byte(string(this.userId)))
buffer.WriteString(this.token)
buffer.WriteString(string(cfg.AppId))
buffer.WriteString(cfg.AppSecret)
io.WriteString(w, buffer.String())
md5str2 := fmt.Sprintf("%x", w.Sum(nil))
return md5str
}
将一个json数据post出去
func postJson() {
...
url := cfg.getHost()
user := &User{userId: 220,
token: "adfasfdasfdasfdsafdasfdasfdsafdsafdsa",
exInfo: ""}
resp, err := http.Post(url, "application/json", user.calcJson(cfg))
if err != nil {
log.Print(err)
}
defer resp.Body.Close()
fmt.Printf("Status: %s\n", resp.Status)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logrus.Warnf("testLogin err: %v", err.Error())
return
}
logrus.Debug(string(body))
}
使用连接串方式来 post出去
填充字串
func (this *User) calcText(cfg *Cfg) url.Values {
return url.Values{""packageId": {fmt.Sprintf("%d", cfg.PackageId)},
"thirdUserId": {fmt.Sprintf("%d", this.userId)},
"token": {this.token},
"exInfo": {this.exInfo},
"sign": {this.calcMd5(cfg)}}
}
将字串发送出去
func postText() {
cfg := readCfg()
url := cfg.getHost()
user := &User{userId: 220,
token: "adfasfdasfdasfdsafdasfdasfdsafdsafdsa",
exInfo: ""}
val := user.calcText(cfg)
logrus.Debugf("postText rawStr: %v", val.Encode())
response, err := http.PostForm(url, val)
if err != nil {
logrus.Fatalf("postText err: %v", err.Error())
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
logrus.Fatalf("postText err: %v", err.Error())
}
fmt.Printf("%s\n", string(body))
}