HTTP
超文本传输协议 (HTTP) 是一种用于分布式协作超媒体信息系统的应用协议。 HTTP 协议是万维网数据通信的基础。
学习web,必须回http协议,万变不离其宗,http 基本请求都会有get和post方式。
获取get
HTTP GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据。
HTTP POST
HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完整的 Web 表单。
go http
在 Go 中,我们使用 http 包来创建 GET 和 POST 请求。该包提供 HTTP 客户端和服务器实现。
go GET 请求
以下示例在 Go 中创建一个简单的 GET 请求。
通过使用自己的账号
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
resp, err :=http.Get("https://www.jianshu.com/u/jianshuaccount")
if err !=nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err :=ioutil.ReadAll(resp.Body)
if err !=nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
抓取的get的页面内容如下:
GOROOT=D:\Program Files\Go #gosetup
GOPATH=D:\Users\dev\sdk\go1.15.14 #gosetup
"D:\Program Files\Go\bin\go.exe" build -o C:\Users\Dev\AppData\Local\Temp\GoLand\___go_build_get_go.exe D:\gowork\beegoDemo\src\main\get.go #gosetup
C:\Users\Dev\AppData\Local\Temp\GoLand\___go_build_get_go.exe #gosetup
-->
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?0c0e9d9b1e7d617b3e6842e85b9fb068";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
(function () {
var hm = document.createElement('script');
hm.src = 'https://v1.cnzz.com/z_stat.php?id=xxxx&web_id=xxx';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
}());
function addPoint (e) {
e.stopPropagation();
JsSensor.trackEvent(SAEVENTS.PC_HEADER_TAB_CLICK,{tab:'程序员专区',place:'首页'});
}
-
-
-
-
-
-
-
使用 Pytest 进行有效的 Python 测试 测试您的代码会带来各种各样的好处。它增加了您对代码按预期运行的信心,并确保对代码的更改不会导...
-
-
setTimeout(function(){
if(window.JsSensor){
JsSensor.trackEvent(SAEVENTS.PC_AD_SHOW, {
page: '他人主页',
place: '信息流广告'+ 1,
uid: 'u3179110'
});
}
},1500)
setTimeout(function(){
if(window.JsSensor){
JsSensor.trackEvent(SAEVENTS.PC_AD_SHOW, {
page: '他人主页',
place: '信息流广告'+ 2,
uid: 'u3179110'
});
}
},1500)
Process finished with the exit code 0
可以看出来,里面就是我首页的内容,内容的主要id,我屏蔽了,感兴趣的同学,可以直接抓一下。
2.异步请求
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"regexp"
"sync"
)
func main() {
urls := []string{
"http://webcode.me",
"https://example.com",
"http://httpbin.org",
"https://www.perl.org",
"https://www.php.net",
"https://www.python.org",
"https://code.visualstudio.com",
"https://clojure.org",
"https://www.baidu.com",
}
var wgsync.WaitGroup
for _, u :=range urls {
wg.Add(1)
go func(urlstring) {
defer wg.Done()
content :=doReq(url)
title :=getTitle(content)
fmt.Println(title)
}(u)
}
wg.Wait()
}
func doReq(urlstring) (contentstring) {
resp, err :=http.Get(url)
defer resp.Body.Close()
body, err :=ioutil.ReadAll(resp.Body)
if err !=nil {
log.Fatal(err)
}
return string(body)
}
func getTitle(contentstring) (titlestring) {
re :=regexp.MustCompile("
parts := re.FindStringSubmatch(content)
if len(parts) >0 {
return parts[1]
}else {
return "no title"
}
}
我们发出多个异步 HTTP 请求。我们得到每个网页的标题标签的内容。
The Perl Programming Language - www.perl.org
My html page
httpbin.org
Clojure
Example Domain
PHP: Hypertext Preprocessor
Welcome to Python.org
Visual Studio Code - Code Editing. Redefined
百度一下,你就知道
3.带有查询参数的 GET 请求
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
)
func main() {
name :="kenychen"
occupation :="gardener"
params :="name=" +url.QueryEscape(name) +"&" +
"occupation=" +url.QueryEscape(occupation)
path :=fmt.Sprintf("https://httpbin.org/get?%s", params)
resp, err :=http.Get(path)
if err !=nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err :=ioutil.ReadAll(resp.Body)
if err !=nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
运行结果
{
"args": {
"name": "kenychen",
"occupation": "gardener"
},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "Go-http-client/2.0",
"X-Amzn-Trace-Id": "Root=1-6123339d-1c30bc7a15b0f90200337e4a"
},
"origin": "20.44.231.34",
"url": "https://httpbin.org/get?name=kenychen&occupation=gardener"
}
Go HTTP POST 请求 FORM 数据
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
)
func main() {
data :=url.Values{
"name": {"kenychen"},
"occupation": {"gardener"},
}
resp, err :=http.PostForm("https://httpbin.org/post", data)
if err !=nil {
log.Fatal(err)
}
var resmap[string]interface{}
json.NewDecoder(resp.Body).Decode(&res)
fmt.Println(res["form"])
}
运行效果:
"D:\Program Files\Go\bin\go.exe" build -o C:\Users\Dev\AppData\Local\Temp\GoLand\___go_build_post_req_form_go.exe D:\gowork\beegoDemo\src\main\post_req_form.go #gosetup
C:\Users\Dev\AppData\Local\Temp\GoLand\___go_build_post_req_form_go.exe #gosetup
map[name:kenychen occupation:gardener]
Go HTTP POST request JSON data
import (
"bytes"
"encoding/json"
"fmt"
"log"
"net/http"
)
func main() {
values := map[string]string{"name": "kenychen", "occupation": "gardener"}
json_data, err := json.Marshal(values)
if err != nil {
log.Fatal(err)
}
resp, err := http.Post("https://httpbin.org/post", "application/json",
bytes.NewBuffer(json_data))
if err != nil {
log.Fatal(err)
}
var res map[string]interface{}
json.NewDecoder(resp.Body).Decode(&res)
fmt.Println(res["json"])
}