Golang实现web api接口调用及web数据抓取[get post模式]
前沿: 继续扩展我的golang服务端,这边有些数据库是没有权限的,对方给了我webservices的接口,针对异常的数据,我要去抓数据,再次分析,golang貌似没有python那么多的模拟浏览器访问的模块,还好默认的http就支持。 功能一点都不必urllib2 差。。。 正题!!! 这里是通过golang提供的net/http模块, http.NewRequest来进行数据抓取。 他能实现python下的urllib2的功能 ! 原文:http://rfyiamcool.blog.51cto.com/1030776/1384473 原理不多说了,大家直接套用这两个get post的例子吧。 可以任意的加header头,比如怎么加一个浏览器的标识 ! client := &http.Client{] req,err := http.NewRequest("POST","http://127.0.0.1",bytes.NewReader(postData)) req.Header.Add("User-Agent","无敌浏览器") resp,err := client.Do(req) defer resp.Body.Close() 下面是完整的例子,可以加更多的Header #http://xiaorui.cc package main import ( "net/http" "io/ioutil" "fmt" "net/url" ) func main() { client := &http.Client{} reqest,_ := http.NewRequest("GET","http://127.0.0.1/",nil) reqest.Header.Set("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") reqest.Header.Set("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3") reqest.Header.Set("Accept-Encoding","gzip,deflate,sdch") reqest.Header.Set("Accept-Language","zh-CN,zh;q=0.8") reqest.Header.Set("Cache-Control","max-age=0") reqest.Header.Set("Connection","keep-alive") reqest.Header.Set("User-Agent","chrome 100") response,_ := client.Do(reqest) if response.StatusCode == 200 { body,_ := ioutil.ReadAll(response.Body) bodystr := string(body); fmt.Println(bodystr) } // reqest,_ = http.NewRequest("POST","http:/127.0.0.1/",bytes.NewBufferString(data.Encode())) / respet1,_ := http.NewRequest("POST",url.Values{"key":"Value"}) // reqest1.Header.Set("User-Agent","chrome 100") // client.Do(reqest1) } 我们再来测试下 post获取数据 !
#http://xiaorui.cc package main import( "fmt" "net/http" "net/url" "io/ioutil" ) func main(){ get() post() } func get(){ response,_:=http.Get("http://127.0.0.1/") defer response.Body.Close() body,_:=ioutil.ReadAll(response.Body) fmt.Println(string(body)) if response.StatusCode == 200 {= fmt.Println("ok") }else{ fmt.Println("error") } } func post(){ //resp,err := http.PostForm("http://127.0.0.1",url.Values{"name": {"ruifengyun"},"blog": {"xiaorui.cc"},"aihao":{"python golang"},"content":{"nima,fuck "}}) } 我们用http加上golang的runtime可以搞成类似 ab的压力测试工具,我昨天写了一个版本,但是在压倒3k以上的链接数的时候,会出现不少的error,原因可能是linux本身没有做tcp的优化,获取是对端的tornado没有用@gen,所以效率跟不上去,我的压力程序没有做defer panic处理。 今天看了下 golang的 gb压力测试工具,发现主要的思路是相同的,但是很多的细节没有做处理,比如channel的同步是用那种for <-c 的土方法实现的。 我的程序是有问题,但是老外有大牛已经构建了一套类似ab的工具,性能差不多,但是这个支持更多的选项和参数,包括代理,基本认证,请求头header信息,长链接,post,gzip压缩,开启几个cpu核心,cookie的插入。 go get github.com/parkghost/gohttpbench go build -o gb github.com/parkghost/gohttpbench 用golang实现的搞并发的压力测试工具 ! 原文:xiaoruicc -A="": Add Basic WWW Authentication,the attributes are a colon separated username and password. -C=[]: Add cookie,eg. 'Apache=1234. (repeatable) -G=4: Number of CPU -H=[]: Add Arbitrary header line,eg. 'Accept-Encoding: gzip' Inserted after all normal header lines. (r epeatable) -T="text/plain": Content-type header for POSTing,eg. 'application/x-www-form-urlencoded' Default is 'te xt/plain' -c=1: Number of multiple requests to make -h=false: Display usage information (this message) -i=false: Use HEAD instead of GET -k=false: Use HTTP KeepAlive feature -n=1: Number of requests to perform -p="": File containing data to POST. Remember also to set -T -r=false: Don't exit when errors -t=0: Seconds to max. wait for responses -u="": File containing data to PUT. Remember also to set -T -v=0: How much troubleshooting info to print -z=false: Use HTTP Gzip feature 具体的用法: 咱们在看看nginx服务端的日志情况: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |