• golang实现get和post请求的服务端和客户端


    服务端
    在golang中,实现一个普通的http接口可以处理get请求和x-www-form-urlencoded类型的post请求,而如果想实现处理json数据的post请求,则需要用另外的方式实现,接收的参数要从request.Body中读取:

    getpost.go

    package main
    
    import (
        "net/http"
        "encoding/json"
        "log"
    )
    
    func main()  {
    
        http.HandleFunc("/login1", login1)
        http.HandleFunc("/login2", login2)
        http.ListenAndServe("0.0.0.0:8080", nil)
    }
    
    type Resp struct {
        Code    string `json:"code"`
        Msg     string `json:"msg"`
    }
    
    type  Auth struct {
        Username string `json:"username"`
        Pwd      string   `json:"password"`
    }
    
    //post接口接收json数据
    func login1(writer http.ResponseWriter,  request *http.Request)  {
        var auth Auth
        if err := json.NewDecoder(request.Body).Decode(&auth); err != nil {
            request.Body.Close()
            log.Fatal(err)
        }
        var result  Resp
        if auth.Username == "admin" && auth.Pwd == "123456" {
            result.Code = "200"
            result.Msg = "登录成功"
        } else {
            result.Code = "401"
            result.Msg = "账户名或密码错误"
        }
        if err := json.NewEncoder(writer).Encode(result); err != nil {
            log.Fatal(err)
        }
    }
    
    //接收x-www-form-urlencoded类型的post请求或者普通get请求
    func login2(writer http.ResponseWriter,  request *http.Request)  {
        request.ParseForm()
        username, uError :=  request.Form["username"]
        pwd, pError :=  request.Form["password"]
    
        var result  Resp
        if !uError || !pError {
            result.Code = "401"
            result.Msg = "登录失败"
        } else if username[0] == "admin" && pwd[0] == "123456" {
            result.Code = "200"
            result.Msg = "登录成功"
        } else {
            result.Code = "203"
            result.Msg = "账户名或密码错误"
        }
        if err := json.NewEncoder(writer).Encode(result); err != nil {
            log.Fatal(err)
        }
    }
    

    客户端
    golang的标准api中用于http客户端请求的主要有三个api : http.Get,http.Post,http.PostForm,其区别如下:

    API 特点
    http.Get 发送get请求
    http.Post post请求提交指定类型的数据
    http.PostForm post请求提交application/x-www-form-urlencoded数据

    在使用http客户端api的时候要注意一个问题:请求地址的url必须是带http://协议头的完整url,不然请求结果为空。

    getpostclient.go

    package main
    
    import (
        "net/http"
        "fmt"
        "io/ioutil"
        "net/url"
        "encoding/json"
        "bytes"
    )
    
    type  auth struct {
        Username string `json:"username"`
        Pwd      string   `json:"password"`
    }
    
    func main()  {
        get()
        postWithJson()
        postWithUrlencoded()
    }
    
    func get()  {
        //get请求
        //http.Get的参数必须是带http://协议头的完整url,不然请求结果为空
        resp, _ := http.Get("http://localhost:8080/login2?username=admin&password=123456")
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        //fmt.Println(string(body))
        fmt.Printf("Get request result: %s
    ", string(body))
    }
    
    func postWithJson()  {
        //post请求提交json数据
        auths := auth{"admin","123456"}
        ba, _ := json.Marshal(auths)
        resp, _ := http.Post("http://localhost:8080/login1","application/json", bytes.NewBuffer([]byte(ba)))
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Printf("Post request with json result: %s
    ", string(body))
    }
    
    func postWithUrlencoded()  {
        //post请求提交application/x-www-form-urlencoded数据
        form := make(url.Values)
        form.Set("username","admin")
        form.Add("password","123456")
        resp, _ := http.PostForm("http://localhost:8080/login2", form)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Printf("Post request with application/x-www-form-urlencoded result: %s
    ", string(body))
    }
    

    运行getpost.go后再运行getpostclient输出结果如下:

    Get request result: {"code":"200","msg":"登录成功"}
    
    Post request with json result: {"code":"200","msg":"登录成功"}
    
    Post request with application/x-www-form-urlencoded result: {"code":"200","msg":"登录成功"}
    
    Process finished with exit code 0
    
  • 相关阅读:
    大屏设计
    ES6课程---11、promise对象实例
    ES6课程---10、promise对象
    心得体悟帖---200502(读西游记之修心)
    ES6参考---promise对象结构分析
    javascript疑难问题---18、回调函数做异步操作
    javascript疑难问题---17、js中in关键字使用总结
    javascript疑难问题---16、类数组对象转换成数组
    javascript疑难问题---15、类数组对象
    心得体悟帖---200501(情感回馈,一般你怎么对待别人,别人也会怎么对待你)
  • 原文地址:https://www.cnblogs.com/enumx/p/12317069.html
Copyright © 2020-2023  润新知