zoukankan      html  css  js  c++  java
  • golang curl

      1 /**
      2 1.可设置代理
      3 2.可设置 cookie
      4 3.自动保存并应用响应的 cookie
      5 4.自动为重新向的请求添加 cookie
      6 */
      7 package curl
      8 
      9 import (
     10     "net/http"
     11     "net/url"
     12     "io/ioutil"
     13     "strings"
     14 )
     15 
     16 type Browser struct {
     17     cookies []*http.Cookie;
     18     client *http.Client;
     19 }
     20 
     21 //初始化
     22 func NewBrowser() *Browser {
     23     hc := &Browser{};
     24     hc.client = &http.Client{};
     25     //为所有重定向的请求增加cookie
     26     hc.client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
     27         if len(via) > 0 {
     28             for _,v := range hc.GetCookie() {
     29                 req.AddCookie(v);
     30             }
     31         }
     32         return nil
     33     }
     34     return hc;
     35 }
     36 
     37 //设置代理地址
     38 func (self *Browser) SetProxyUrl(proxyUrl string)  {
     39     proxy := func(_ *http.Request) (*url.URL, error) {
     40         return url.Parse(proxyUrl);
     41     };
     42     transport := &http.Transport{Proxy:proxy};
     43     self.client.Transport = transport;
     44 }
     45 
     46 //设置请求cookie
     47 func (self *Browser) AddCookie(cookies []*http.Cookie)  {
     48     self.cookies = append(self.cookies, cookies...);
     49 }
     50 
     51 //获取当前所有的cookie
     52 func (self *Browser) GetCookie() ([]*http.Cookie) {
     53     return self.cookies;
     54 }
     55 
     56 //发送Get请求
     57 func (self *Browser) Get(requestUrl string) ([]byte, int) {
     58     request,_ := http.NewRequest("GET", requestUrl, nil);
     59     self.setRequestCookie(request);
     60     response,_ := self.client.Do(request);
     61     defer response.Body.Close();
     62 
     63     data, _ := ioutil.ReadAll(response.Body)
     64     return data, response.StatusCode;
     65 }
     66 
     67 //发送Post请求
     68 func (self *Browser) Post(requestUrl string, params map[string]string) ([]byte) {
     69     postData := self.encodeParams(params);
     70     request,_ := http.NewRequest("POST", requestUrl, strings.NewReader(postData));
     71     request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
     72     self.setRequestCookie(request);
     73 
     74     response,_ := self.client.Do(request);
     75     defer response.Body.Close();
     76 
     77     //保存响应的 cookie
     78     respCks := response.Cookies();
     79     self.cookies = append(self.cookies, respCks...);
     80 
     81     data, _ := ioutil.ReadAll(response.Body)
     82     return data;
     83 }
     84 
     85 
     86 //为请求设置 cookie
     87 func (self *Browser) setRequestCookie(request *http.Request)  {
     88     for _,v := range self.cookies{
     89         request.AddCookie(v)
     90     }
     91 }
     92 
     93 //参数 encode
     94 func (self *Browser) encodeParams(params map[string]string) string {
     95     paramsData := url.Values{};
     96     for k,v := range params {
     97         paramsData.Set(k,v);
     98     }
     99     return paramsData.Encode();
    100 }
  • 相关阅读:
    linux下syscall函数 间接系统调用
    多线程 概述
    linux 信号与多线程
    linux ps命令介绍
    终端 进程关系
    shell 前台进程组的选择
    try catch finally的执行顺序到底是怎样的?
    OpenCV中遇到Microsoft C++ 异常 cv::Exception
    hdu1087Super Jumping! Jumping! Jumping!(最大递增序列和)
    [置顶] java Gui 键盘监听事件
  • 原文地址:https://www.cnblogs.com/hanyouchun/p/6382682.html
Copyright © 2011-2022 走看看