美文网首页程序园技术初心
C# 与 Go 的互通代码笔记

C# 与 Go 的互通代码笔记

作者: triplestudio | 来源:发表于2019-11-07 11:04 被阅读0次

    互通基础篇:C# 结合 Golang 开发

    1. Go 项目结构推荐

    【参考资料】Go 项目结构推荐
    在一开始搭建 Go 项目时,就使用推荐的目录结构方式,可以让项目结构更清晰,互通性增强,从而也增强项目的可阅读性。

    /cmd
    项目主要应用文件(/cmd/myapps),保持文件与项目生成可执行文件名称相同,通常是较简单的main.go文件调用/internal和/pkg代码
    /internal
    项目内部调用文件,包含应用私有代码(/internal/app/myapps),应用通过代码(/internal/pkg/myprivlibs)
    Standard Go Project Layout

    2. GO 加解密相关

    【参考资料】Des、Rsa加解密互通系列之Golang 实现
    【参考资料】Go 实现 DES 加密和解密一些知识要点

    3. POST 参数生成

    参考资料】golang使用http client发起get和post请求示例

    3.1 拼接 application/x-www-form-urlencoded 的 post 字符串

    可以使用以下方式:

    var r http.Request
    r.ParseForm()
    r.Form.Add("uuid", "aaaaaaaa&lasf=aaa")
    bodystr := strings.TrimSpace(r.Form.Encode())
    

    3.2 关键写法

    resp, err := http.Post("http://www.01happy.com/demo/accept.php",
            "application/x-www-form-urlencoded",
            strings.NewReader(bodystr))
    
    req, err := http.NewRequest("POST", "http://www.01happy.com/demo/accept.php", strings.NewReader(bodystr))
    

    3.3 具体方法

    //发送GET请求
    //url:请求地址
    //response:请求返回的内容
    func Get(url string) (response string) {
        client := http.Client{Timeout: 5 * time.Second}
        resp, error := client.Get(url)
        defer resp.Body.Close()
        if error != nil {
            panic(error)
        }
    
        var buffer [512]byte
        result := bytes.NewBuffer(nil)
        for {
            n, err := resp.Body.Read(buffer[0:])
            result.Write(buffer[0:n])
            if err != nil && err == io.EOF {
                break
            } else if err != nil {
                panic(err)
            }
        }
    
        response = result.String()
        return
    }
    
    //发送POST请求
    //url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json
    //content:请求放回的内容
    func Post(url string, data interface{}, contentType string) (content string) {
        jsonStr, _ := json.Marshal(data)
        reader := bytes.NewBuffer(jsonStr)
        switch data.(type) {
        case string:
            reader = bytes.NewBufferString(data.(string))
            fmt.Println(data.(string))
        }
    
        req, err := http.NewRequest("POST", url, reader)
        req.Header.Add("content-type", contentType)
        if err != nil {
            panic(err)
        }
        defer req.Body.Close()
    
        client := &http.Client{Timeout: 5 * time.Second}
        resp, error := client.Do(req)
        if error != nil {
            panic(error)
        }
        defer resp.Body.Close()
    
        result, _ := ioutil.ReadAll(resp.Body)
        content = string(result)
        return
    }
    

    4. 一些小知识点

    map 作 json 功能

    func BaseResultJson(errCode int, errMsg string) map[string]interface{} {
        m := make(map[string]interface{})
        m["err_code"] = errCode
        m["err_msg"] = errMsg
        return m
    }
    
    m := common.BaseResultJson(101, "请求失败!")
    j, _ := json.Marshal(m)
    fmt.Println(string(j))
    

    Go DLL 中的异常得自己处理,否则会导致程序崩溃(闪退)。

    func TrialDefer() (content string) {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println(r)
                m := common.BaseResultJson(101, "请求失败!")
                j, _ := json.Marshal(m)
                content = string(j)
            }
        }()
    
        var r http.Request
        r.ParseForm()
        timeStr := time.Now().Format("20060102")
    
        r.Form.Add("timeStr", timeStr)
        bodystr := strings.TrimSpace(r.Form.Encode())
    
        content = Post("http://www.sag.xcom/xxx", bodystr, "application/x-www-form-urlencoded")
    
        return
    }
    

    相关文章

      网友评论

        本文标题:C# 与 Go 的互通代码笔记

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