go语言接收html传值,【记录】go语言中实现http的POST且传递对应的post data

  • Post author:
  • Post category:其他


【背景】

折腾:

期间,需要去发送POST操作,去模拟登陆百度,且post时要传递对应的post数据。

【折腾过程】

1.自己参考官网:

去看看,POST的参数和NewRequest的参数。

2.期间想要实现go中的函数的可选参数,默认参数,结果不支持:

3.后来看了半天,很多帖子,貌似都是那个Form或PostForm的,但是感觉不太对。

4.参考:

看到是http.NewRequest设置为POST时,还传递了对应的postData了。

然后就去看看:

bytes.NewReader

的输入参数,是什么类型的。

然后发现,就是普通的,byte[]

5.所以到目前为止,貌似明白了:

对于POST时所要传递的post data

是需要:

在http.NewRequest

时传入给:

的,

但是:

不会用。

而别人传入的:

还是基本能看懂的:

就是一个普通的reader,然后输入的是[]byte

而这个[]byte

是post data这string,被转换为对应的[]byte

而对应的post data的string,是key=value,中间通过&分隔开的。

需要自己,对于输入的postDict的键值对,自己组合出来。

或者是:

go中,或许也有对应的库函数去实现encode。

6.而之前看到:

看看有没有这样的工具。

不过貌似没看到。

但是看到其他的东西:

可以帮你打印出来request,供调试用。

7.看到:

想到了:

go中,是不会用另外的url,去实现类似于

C#中的HttpUtility.UrlEncode?

所以去看看url:

然后终于找到所要的了:func (Values) Encodefunc (v Values) Encode() string

Encode encodes the values into “URL encoded” form. e.g. “foo=bar&bar=baz”

8.然后就可以去尝试写POST相关代码了。

然后是用下面核心代码:/*

* [File]

* EmulateLoginBaidu.go

*

* [Function]

* 【记录】用go语言实现模拟登陆百度

* https://www.crifan.com/emulate_login_baidu_using_go_language/

*

* [Version]

* 2013-09-21

*

* [Contact]

* https://www.crifan.com/about/me/

*/

package main

import (

“fmt”

“os”

“runtime”

“path”

“strings”

“time”

//”io”

“io/ioutil”

“net/http”

“net/http/cookiejar”

“net/url”

“bytes”

)

/***************************************************************************************************

Global Variables

***************************************************************************************************/

var gCurCookies []*http.Cookie;

var gCurCookieJar *cookiejar.Jar;

var gLogger log4go.Logger;

/***************************************************************************************************

Functions

***************************************************************************************************/

//do init before all others

func initAll(){

gCurCookies = nil

//var err error;

gCurCookieJar,_ = cookiejar.New(nil)

gLogger = nil

//……

}

//get url response html

func getUrlRespHtml(strUrl string, postDict map[string]string) string{

gLogger.Info(“getUrlRespHtml, strUrl=%s”, strUrl)

gLogger.Info(“postDict=%s”, postDict)

var respHtml string = “”;

httpClient := &http.Client{

//Transport:nil,

//CheckRedirect: nil,

Jar:gCurCookieJar,

}

v