• Go语言入门心法(六): HTTP面向客户端|服务端编程



    Go语言入门心法(一): 基础语法

    Go语言入门心法(二): 结构体

    Go语言入门心法(三): 接口

    Go语言入门心法(四): 异常体系

     Go语言入门心法(五): 函数

    Go语言入门心法(六): HTTP面向客户端|服务端编程

    Go语言入门心法(七): 并发与通道

    Go语言入门心法(八): mysql驱动安装报错onnection failed

    Go语言入门心法(九): 引入三方依赖

    Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理

    Go语言入门心法(十一): 文件处理

    Go语言入门心法(十二): GORM映射框架

    Go语言入门心法(十三): 反射认知升维

     




    一:go语言面向web编程认知

    Go语言的最大优势在于并发与性能,其性能可以媲美C和C++,并发在网络编程中更是至关重要
    使用http发送请求,http包提供了HTTP客户端和服务器端的实现,使用HTTP客户端,需要理解和掌握两个非常重要的类型:
    
          (1) Client客户端
          (2) Request求体
           go语言模拟向浏览器发起HTTP请求,发起请求需要创建一个请求对象,使用NewRequest来创建

    1. package main
    2. import (
    3. "fmt"
    4. "io"
    5. "net/http"
    6. )
    7. /*
    8. Go语言的最大优势在于并发与性能,其性能可以媲美C和C++,并发在网络编程中更是至关重要
    9. 使用http发送请求,http包提供了HTTP客户端和服务器端的实现,使用HTTP客户端,需要理解和掌握两个非常重要的类型:
    10. (1) Client客户端
    11. (2) Request求体
    12. go语言模拟向浏览器发起HTTP请求,发起请求需要创建一个请求对象,使用NewRequest来创建
    13. */
    14. func main() {
    15. // 使用NewRequest模拟浏览器向服务器发送HTTP请求
    16. client := &http.Client{}
    17. // 访问:爱奇艺-在线视频网站-海量正版高清视频在线观看 首页
    18. request, err := http.NewRequest("GET", "https://www.iqiyi.com/", nil)
    19. if err != nil {
    20. fmt.Println(err)
    21. }
    22. response, err := client.Do(request)
    23. fmt.Println(response.StatusCode)
    24. res, err := io.ReadAll(response.Body)
    25. if err != nil {
    26. fmt.Println(err)
    27. }
    28. // 打印body
    29. fmt.Println(string(res))
    30. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerToWebRequest_go.exe D:\program_file\go_workspace\org.jd.data\http\OOPHttpServerToWebRequest.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerToWebRequest_go.exe
    200

        爱奇艺-在线视频网站-海量正版高清视频在线观看 data-n-head="ssr" rel="canonical" href="//www.iqiyi.com/">
    href="//stc.iqiyipic.com/gaze/pcw/ssr/pages/cloudCinema/pages/cloudCinema1/pages/cloudCinemaPCA/pages/cloudCinemaPCA1/pages/components/pag/8c7f18db.462771861c0e477fb66d.js" as="script"> s="script">
     
     
       

    10/16/2023, 8:03:36 PM<
    /div>
    上传
    二: 添加请求体Cookie,伪装浏览器登录状态 
    模拟流量器登录:
    当访问某些资源时,需要登录后才能访问,此时我们模拟登录,使得被访问的资源知道我们使用go编程的爬虫客户端是登录状态;
    这就需要设置Cookie,Cookie通常用来标识客户端的登录状态;Request实例可以使用AddCookie方法给请求添加Cookie
    

    1. package main
    2. import (
    3. "fmt"
    4. "io"
    5. "net/http"
    6. "strconv"
    7. )
    8. /*
    9. 模拟流量器登录:
    10. 当访问某些资源时,需要登录后才能访问,此时我们模拟登录,使得被访问的资源知道我们使用go编程的爬虫客户端是登录状态;
    11. 这就需要设置Cookie,Cookie通常用来标识客户端的登录状态;Request实例可以使用AddCookie方法给请求添加Cookie
    12. */
    13. func main() {
    14. client := &http.Client{}
    15. request, err := http.NewRequest("GET", "https://www.iqiyi.com/", nil)
    16. if err != nil {
    17. fmt.Println(err)
    18. }
    19. // 使用http.Cookie结构体初始化一个Cookie键值对
    20. cookie := &http.Cookie{Name: "userId", Value: strconv.Itoa(12345)}
    21. // 使用前面的构建的request方法AddCookie往请求中添加Cookie
    22. request.AddCookie(cookie)
    23. request.AddCookie(&http.Cookie{Name: "session", Value: "YWRtaW4="})
    24. response, err := client.Do(request)
    25. fmt.Println(response.Request.Cookies())
    26. fmt.Println(response.StatusCode)
    27. res, err := io.ReadAll(response.Body)
    28. if err != nil {
    29. fmt.Println(err)
    30. }
    31. // 打印body
    32. fmt.Println(string(res))
    33. }

    运行效果: 通常服务器使用session来判断客户端是否为登录用户   

    [userId=12345 session=YWRtaW4=]


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerToCookieLoginBrowser_go.exe D:\program_file\go_workspace\org.jd.data\http\OOPHttpServerToCookieLoginBrowser.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerToCookieLoginBrowser_go.exe
    [userId=12345 session=YWRtaW4=]
    200

        爱奇艺-在线视频网站-海量正版高清视频在线观看 YI.COM)拥有海量、优质、高清的影视剧集等视频内容。爱奇艺VIP限时新                                                                                                                                                                新
    户特惠:首月6元,会员畅看顶级视听品质体验!当前热播《唐朝诡事录》《一年一度喜剧大赛2》《航海王》《请君》"> iv="Cache-Control" content="no-transform"> "ssr" rel="icon" type="image/x-icon" href="//www.iqiyipic.com/pcwimg/128-128-logo.png"> ="ssr" rel="dns-prefetch" href="//datax.baidu.com"> 

    三: 请求体添加Header,绕过反爬策略


    有需网站作了反爬措施,一般会通过根据Header头中的User-Agent的值解析判断是浏览器还是爬虫;
    这时我们需要设置成浏览器的UA来绕过这类反爬措施;Request可以直接使用request.Header.Set(key,value)来设置Header

    1. package main
    2. import (
    3. "compress/flate"
    4. "compress/gzip"
    5. "fmt"
    6. "io"
    7. "net/http"
    8. )
    9. func main() {
    10. println(`
    11. 有需网站作了反爬措施,一般会通过根据Header头中的User-Agent的值解析判断是浏览器还是爬虫;
    12. 这时我们需要设置成浏览器的UA来绕过这类反爬措施;Request可以直接使用request.Header.Set(key,value)来设置Header
    13. `)
    14. client := &http.Client{}
    15. request, err := http.NewRequest("GET", "http://www.baidu.com/", nil)
    16. if err != nil {
    17. fmt.Println(err)
    18. }
    19. // 设置request的header,具体可参考HTTP协议
    20. request.Header.Set("Accept", "text/html, application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8")
    21. request.Header.Set("Accept-Charset", "UTF-8, utf-8;q=0.7, *; q=0.3")
    22. request.Header.Set("Accept-Encoding", "gzip,deflate,sdch")
    23. request.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")
    24. request.Header.Set("Cache-Control", "max-age=0")
    25. request.Header.Set("Connection", "keep-alive")
    26. request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/72.0.3626.121 Safari/537.36")
    27. response, err := client.Do(request)
    28. fmt.Printf("%#v", response.Request.Header)
    29. //res, err := io.ReadAll(response.Body)
    30. switch response.Header.Get("Content-Encoding") {
    31. case "gzip":
    32. bodyReader, err := gzip.NewReader(response.Body)
    33. if err != nil {
    34. fmt.Println(err)
    35. }
    36. res, err := io.ReadAll(bodyReader)
    37. // 打印body
    38. fmt.Println(string(res))
    39. case "deflate":
    40. bodyReader := flate.NewReader(response.Body)
    41. res, err := io.ReadAll(bodyReader)
    42. if err != nil {
    43. fmt.Println(err)
    44. }
    45. // 打印body
    46. fmt.Println(string(res))
    47. default:
    48. bodyReader := response.Body
    49. res, err := io.ReadAll(bodyReader)
    50. if err != nil {
    51. fmt.Println(err)
    52. }
    53. // 打印body
    54. fmt.Println(string(res))
    55. }
    56. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerGetToSetHeaderRequest_go.exe D:\program_file\go_workspace\org.jd.data\http\OOPHttpServerGetToSetHeaderRequest.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerGetToSetHeaderRequest_go.exe

            有需网站作了反爬措施,一般会通过根据Header头中的User-Agent的值解析判断是浏览器还是爬虫;
            这时我们需要设置成浏览器的UA来绕过这类反爬措施;Request可以直接使用request.Header.Set(key,value)来设置Header

    http.Header{"Accept":[]string{"text/html, application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8"}, "Accept-Charset":[]string{"UTF-8, utf-8;q=0.7, *; q=0.3"}, "Accept-Encoding":[]string{"gzip,deflate,sdch"}, "Accept-Language":[]string{"zh-CN,zh;q=0.8"}, "Cache-Control":[]string{"max-age=0"}, "Connection":[]string{"keep-alive"}, "Referer":[]string{"http://www.baidu.com/"}, "User-Agent":[]string{"Mozilla/5.0 (Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/72.0.3626.121 Safari/537.36"}}



    百度一下,你就知道


     四: 直接使用Get(url)函数发送请求

    Client类型包含get方法,get方法时对Do方法的封装,使用get方法可以快速发起一个get请求;
    http包中也有一个叫GET的方法,底层就是调用Client的GET方法

    1. package main
    2. import (
    3. "fmt"
    4. "io/ioutil"
    5. "net/http"
    6. )
    7. /*
    8. Client类型包含get方法,get方法时对Do方法的封装,使用get方法可以快速发起一个get请求;
    9. http包中也有一个叫GET的方法,底层就是调用Client的GET方法
    10. */
    11. func main() {
    12. // http.Get实际上是DefaultClient.Get(url),Get函数是高度封装的,只有一个参数Url
    13. // 对于一般的http Request是可以使用,但是不能定制Request
    14. response, err := http.Get("http://www.baidu.com")
    15. if err != nil {
    16. fmt.Println(err)
    17. }
    18. defer response.Body.Close()
    19. body, _ := ioutil.ReadAll(response.Body)
    20. fmt.Println(string(body))
    21. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerUseGetMethodToSendRequest_go.exe D:\program_file\go_workspace\org.jd.data\http\OOPHttpServerUseGetMethodToSendRequest.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerUseGetMethodToSendRequest_go.exe
    < rel="dns-prefetch" href="//dss1.bdstatic.com"/> 

    五: Post()携带数据发送请求


    post发送web请求
    
       Post向指定的URL发送一个post请求,bodyType为post数据的类型,body为post数据,作为请求主体。
       如果参数body实现了io.Close接口,它会在请求后被关闭,调用者有责任读取完返回值resp的主体后关闭它,
       该方法时对Client的POST方法的封装


    1. package main
    2. import (
    3. "fmt"
    4. "io/ioutil"
    5. "net/http"
    6. "strings"
    7. )
    8. /*
    9. post发送web请求
    10. Post向指定的URL发送一个post请求,bodyType为post数据的类型,body为post数据,作为请求主体。
    11. 如果参数body实现了io.Close接口,它会在请求后被关闭,调用者有责任读取完返回值resp的主体后关闭它,
    12. 该方法时对Client的POST方法的封装
    13. */
    14. func main() {
    15. resp, err := http.Post("https://blog.csdn.net/u014396256/article/details/84645350",
    16. "application/x-www-form-urlencoded",
    17. strings.NewReader("user=admin&pass=admin"))
    18. if err != nil {
    19. fmt.Println(err)
    20. }
    21. defer resp.Body.Close()
    22. body, err := ioutil.ReadAll(resp.Body)
    23. if err != nil {
    24. fmt.Println(err)
    25. }
    26. fmt.Println(string(body))
    27. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerPostToWebRequest_go.exe D:\program_file\go_workspace\org.jd.data\http\OOPHttpServerPostToWebRequest.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPHttpServerPostToWebRequest_go.exe
       


       
       
       
       
       
       
       
       
       
       
       
       
       
        解决@ResponseBody注解返回中文乱码_responsebody返回中文乱码-CSDN博客
       
           
           
       
         {"@context":"https://ziyuan.baidu.com/contexts/cambrian.jsonld","@id":"https://blog.csdn.net/u014396256/article/details/84645350","appid":"1638831770136827","pubDate":"2018-11-30T11:02:20","title":"解决@ResponseBody注解返回中文乱码_responsebody返回中文乱码-CSDN博客","upDate":"2018-11-30T11:02:20"}