C# 与 Go 的互通代码笔记

互通基础篇: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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章