美文网首页
go 网络编程

go 网络编程

作者: 如逆水行舟不进则退 | 来源:发表于2020-08-25 10:14 被阅读0次
    • 客户端网络访问
    package main
    
    import (
      "fmt"
      "io/ioutil"
      "net/http"
    )
    
    func main() {
      testHttpNewRequest()
    }
    
    func testHttpNewRequest()  {
      // 1.创建一个客户端
      client := http.Client{}
      // 2.创建一个请求,请求方式既可以是GET, 也可以是POST
      request, err := http.NewRequest("GET", "https://www.toutiao.com/search/suggest/initial_page/", nil)
    
      checkErr(err)
      // 3.客户端发送请求
      cookName := &http.Cookie{Name:"username", Value: "Steven"}
      // 添加cookie
      request.AddCookie(cookName)
    
      // 设置请求头
      request.Header.Set("Accept-Language", "zh-cn")
      fmt.Printf("Header:%v \n", request.Header)
    
      response, err := client.Do(request)
      checkErr(err)
      defer response.Body.Close()
      // 查看请求头的数据
      fmt.Printf("相应状态码:%v \n", response.StatusCode)
      // 4.操作数据
      if response.StatusCode == 200 {
       data, err := ioutil.ReadAll(response.Body)
       fmt.Println("网络请求成功")
       checkErr(err)
       fmt.Println(string(data))
      } else {
       fmt.Println("网络请求失败", response.Status)
      }
    }
    
    func checkErr(err error)  {
      fmt.Println("09-----------")
      defer func() {
        if ins,ok := recover().(error);ok { // 这种recover的使用方式
          fmt.Println("程序出现异常:", ins.Error())
        }
      }()
      if err != nil {
        panic(err)
      }
    
    }
    
    
    
    
    • 使用client. Get()方法
    package main
    
    import (
      "fmt"
      "net/http"
    )
    
    func main() {
      testClientGet()
    }
    
    func testClientGet()  {
      // 创建客户端
      client := http.Client{}
      // 通过client去请求
      response, err := client.Get("https://www.toutiao.com/search/suggest/initial_page/")
      checkErr(err)
      fmt.Printf("响应状态码:%v \n", response.StatusCode)
      if response.StatusCode == 200 {
        fmt.Println("网络请求成功")
        defer response.Body.Close()
      }
    }
    
    func checkErr(err error)  {
      fmt.Println("09-----------")
      defer func() {
        if ins,ok := recover().(error);ok { // 这种recover的使用方式
          fmt.Println("程序出现异常:", ins.Error())
        }
      }()
      if err != nil {
        panic(err)
      }
    
    }
    
    
    • 使用client. Post()或client.PostForm()方法
    • 使用http. Get()方法
    package main
    
    import (
      "fmt"
      "net/http"
    )
    
    func main() {
      testHttpGet()
    }
    
    func testHttpGet()  {
    
      response, err := http.Get("http://www.baidu.com")
      checkErr(err)
      fmt.Printf("响应状态码:%v \n", response.StatusCode)
      if response.StatusCode == 200 {
        fmt.Println("网络请求成功")
        defer response.Body.Close()
      } else {
        fmt.Println("请求失败",response.Status)
      }
    }
    
    func checkErr(err error)  {
      fmt.Println("09-----------")
      defer func() {
        if ins,ok := recover().(error);ok { // 这种recover的使用方式
          fmt.Println("程序出现异常:", ins.Error())
        }
      }()
      if err != nil {
        panic(err)
      }
    
    }
    
    
    • 使用http. Post()或http.PostForm()方法
    package main
    
    import (
      "fmt"
      "net/http"
      "net/url"
      "strings"
    )
    
    func main() {
      testHttpPost()
    }
    
    func testHttpPost()  {
      //构建参数
      data := url.Values{
        "theCityName" : {"重庆"},
      }
      // 参数转化为body
      reader := strings.NewReader(data.Encode())
      fmt.Println(reader)
      // 发起post请求,MIME 格式
      response, err := http.Post("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName",
        "application/x-www-form-urlencoded",reader)
    
      checkErr(err)
      fmt.Printf("响应状态码:%v \n", response.StatusCode)
      if response.StatusCode == 200 {
        fmt.Println("网络请求成功")
        defer response.Body.Close()
      } else {
        fmt.Println("请求失败",response.Status)
      }
    }
    
    func checkErr(err error)  {
      fmt.Println("09-----------")
      defer func() {
        if ins,ok := recover().(error);ok { // 这种recover的使用方式
          fmt.Println("程序出现异常:", ins.Error())
        }
      }()
      if err != nil {
        panic(err)
      }
    
    }
    
    
    • webserver 使用http. FileServer ()方法
    package main
    
    import "net/http"
    
    func main() {
      testFileServer()
    }
    func testFileServer()  {
      // 如果该路径里有index.html 文件,会优先显示html文件,否则会看到文件目录
      http.ListenAndServe(":2003",http.FileServer(http.Dir("./files/")))
    }
    
    
    
    • 使用http. HandleFunc()方法
    package main
    
    import (
      "fmt"
      "net/http"
    )
    
    func main() {
      // 绑定路径,去触发方法
      http.HandleFunc("/index",indexHandler)
      // 绑定端口
      // 第一个参数为监听地址,第二个参数标识服务器处理程序,通常为nil, 这意味着服务端调用http.DefaultServeMux 进行处理
      err := http.ListenAndServe(":3013",nil)
      fmt.Println(err)
    }
    
    func indexHandler(w http.ResponseWriter, r *http.Request)  {
      fmt.Println("/index=======")
      w.Write([]byte("这是默认首页"))
    }
    
    
    
    • 使用http.NewServeMux()方法
    • 服务端获取客户端请求数据
    • golang模板
    • map转JSON
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    func main() {
      // 定义一个map变量并初始化
      m := map[string][]string{
        "level":{"debug"},
        "message":{"file not found","stack overflow"},
      }
      fmt.Println(m)
      // 将map解析成json格式
      if data,err := json.Marshal(m);err==nil {
        fmt.Printf("%s \n", data)
      }
    }
    
    • map 转json 缩进
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    func main() {
      // 定义一个map变量并初始化
      m := map[string][]string{
        "level":{"debug"},
        "message":{"file not found","stack overflow"},
      }
      fmt.Println(m)
      // 将map解析成json格式
      if data,err := json.MarshalIndent(m,""," ");err==nil {
        fmt.Printf("%s \n", data)
      }
    }
    
    
    
    • 结构体转JSON
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type DebugInfo struct {
      Level string
      Msg string
      author string // 未导出字段不会被json解析(首字母小写)
    }
    func main() {
      // 定义一个结构体切片并初始化
      debugInfos := []DebugInfo{
        DebugInfo{"debug", `file:"test.txt" not found`, "cynhard"} ,
        DebugInfo{"", "logic error", "Gopher"} ,
      }
      // 将结构体解析成JSON格式
      if data,err := json.Marshal(debugInfos);err == nil {
        fmt.Printf("%s \n", data)
      }
    }
    
    
    • 结构体字段标签
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    // 可通过结构体标签,改变编码后json字符串的键名
    type User struct {
      Name string `json:"_name"`
      Age int `json:"_age"`
      Sex uint `json:"-"` // 不解析
      Address string // 不改变key标签
    }
    
    var user = User {
      Name:"Steven",
      Age:35,
      Sex:1,
      Address: "北京海淀区",
    }
    func main() {
      arr, _ := json.Marshal(user)
      fmt.Println(string(arr))
    }
    
    
    • json包在解析匿名字段
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type Point struct {
      X,Y int
    }
    type Circle struct {
      Point
      Radius int
    }
    func main() {
      // 解析匿名字段
      if data, err := json.Marshal(Circle{Point{50,50},25});err == nil {
        fmt.Printf("%s \n", data)
      }
    }
    
    
    • json 转切片
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    func main() {
      // 定义json格式的字符串
      data := `[{"Level":"debug","msg1":"file:\"test.txt\" not found"}, {"Level":"","msg2":"logic error"}]`
      var debugInfos []map[string]string
      // 将字符串解析成map切片
      json.Unmarshal([]byte(data), &debugInfos)
      fmt.Println(debugInfos)
    }
    
    • json 转结构体
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type DebugInfo struct {
      Level string
      Msg string
      author string // 未导出字段不会被json解析
    }
    
    func (debugInfo DebugInfo) String() string {
      return fmt.Sprintf("{Level:%s, Msg:%s}",debugInfo.Level,debugInfo.Msg)
    }
    func main() {
      // 定义json格式的字符串
      data := `[{"Level":"debug","Msg":"file:\"test.txt\" not found","author":"abc"}, {"Level":"","Msg":"logic error","author":"ddd"}]`
      var debugInfos []DebugInfo
      // 将字符串解析成结构体切片
      json.Unmarshal([]byte(data), &debugInfos)
      fmt.Println(debugInfos)
    }
    
    
    • 解码时依然支持结构体字段标签,规则和编码时一样
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type DebugInfo struct {
      Level string `json:"level"` // level 解码成 Level
      Msg string  `json:"message"` // message 解码成 Msg
      Author string `json:"-"` // 忽略Author
    }
    
    func (debugInfo DebugInfo) String() string {
     return fmt.Sprintf("{Level:%s, Msg:%s}",debugInfo.Level,debugInfo.Msg)
    }
    func main() {
      // 定义json格式的字符串
      data := `[{"level":"debug","message":"file:\"test.txt\" not found","author":"abc"}, {"level":"","message":"logic error","author":"ddd"}]`
      var debugInfos []DebugInfo
      // 将字符串解析成结构体切片
      json.Unmarshal([]byte(data), &debugInfos)
      fmt.Println(debugInfos)
    }
    
    • 匿名字段解析
    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type Point struct {
      X,Y int
    }
    type Circle struct {
      Point
      Radius int
    }
    
    func main() {
      // 定义json格式字符串
      data := `{"X":80,"Y":80,"Radius":60}`
      var c Circle
      json.Unmarshal([]byte(data), &c)
      fmt.Println(c)
    }
    

    相关文章

      网友评论

          本文标题:go 网络编程

          本文链接:https://www.haomeiwen.com/subject/fsrojktx.html