【背景】
折腾:
期间,需要去发送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