博客
关于我
go web服务get pos
阅读量:594 次
发布时间:2019-03-12

本文共 5207 字,大约阅读时间需要 17 分钟。

Go语言中的HTTP开发实例及常用功能展示

作为一名开发者,掌握HTTP协议在Go语言中的应用能力是必不可少的。本节将从基础到进阶,通过实际案例讲解Go语言中HTTP请求的处理方法,包括参数获取、表单提交、文件上传等多种场景的实践技巧。

一、在Go语言中获取URL参数

Go语言中处理HTTP请求的库是net/http,其核心功能之一是便捷地提取URL参数。以下是一个简单的例子,展示了如何获取URL中的参数:

package mainimport (    "fmt"    "net/http"    "strings")func sayHelloName(w http.ResponseWriter, r *http.Request) {    r.ParseForm()    fmt.Println(r.Form)    fmt.Println("path", r.URL.Path)    fmt.Println("scheme", r.URL.Scheme)        for k, v := range r.Form {        fmt.Println(k)        fmt.Println(strings.Join(v, ""))    }        fmt.Fprintf(w, "hello %s", r.PostForm("name"))}

启动服务器并访问http://192.168.186.129:8888/?path=123&name=qwe可以看到以下输出:

map[path:[123] name+[qwe]]path 123scheme http是。

该例子展示了如何使用r.ParseForm()提取URL查询参数,以及如何通过r.PostForm获取POST方法传递的参数值。

二、测试POST请求

发送POST请求是HTTP协议中的常用操作,尤其在现代Web应用中占据重要地位。以下是一个测试POST请求的例子,该例子使用url.Values来构建请求参数:

package mainimport (    "fmt"    "io/ioutil"    "net/http"    "net/url"    "strings")func main() {    v := url.Values{}    v.Set("mobile", "18211222233")  # 传递的参数        body := ioutil.NopCloser(strings.NewReader(v.Encode()))  # 创建一个读取器        client := &http.Client{}  # 创建HTTP客户端        req, err := http.NewRequest("POST", "https://passport.baidu.com/?getpassusertype&tt=16522112233", body)  # 发送POST请求        if err != nil {        fmt.Println("Fatal err", err.Error())        return    }        req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")  # 设置请求头        resp, err := client.Do(req)    if err != nil {        fmt.Println("Fatal error")        return    }        content, err := ioutil.ReadAll(resp.Body)    if err != nil {        fmt.Println("Fatal error")        return    }        fmt.Println(string(content))  # 打印响应内容}

该代码模拟了向百度Passport服务发送一个POST请求,传递了一个特定用户的手机号和ID。如果请求成功,会将服务器返回的内容打印出来。

三、测试POST表单提交

在完成基础的HTTP请求操作后,接下来我们将学习如何处理表单提交。在现实开发中,表单提交是连接用户和服务器的重要桥梁。以下是一个实现表单提交的示例:

package mainimport (    "fmt"    "log"    "html/template"    "net/http"    "strconv"    "regexp")func main() {    http.HandleFunc("/login", login)    err := http.ListenAndServe("0.0.0.0:8888", nil)    if err != nil {        log.Fatal("listenandserve", err)    }}func login(w http.ResponseWriter, r *http.Request) {    if r.Method == "GET" {        t, _ := template.ParseFiles("login.html")        t.Execute(w, nil)    } else {        // 提取POST请求的参数        username := r.FormValue("username")        password := r.FormValue("password")        phone := r.FormValue("phone")        like := r.FormValue("like")        sex := r.FormValue("sex")        utype := r.FormValue("utype")        age := r.FormValue("age")                // 验证输入        tag, err := strconv.Atoi(age)        if err != nil {            w.Write([]byte("数字转换错误,填写的不是数字"))            return        }                if username == "" || password == "" || tag == 0 {            w.Write([]byte("username password age must not null"))            return        }                if tag > 100 {            w.Write([]byte("age is too big"))            return        }                // 手机号格式验证        if !regexp.MatchString(`^(17622123322)$`, phone) {            w.Write([]byte("phone is error"))            return        }                // 如果所有验证通过,返回成功消息        w.Write([]byte("ok"))                fmt.Printf("to ok")    }}
  • HTML表单(login.html):
    Login    
用户名:
密码:
phone:
like:
sex:
utype:
age:

该代码实现了一个登录界面,用户需要填写相关信息后提交表单。服务器端通过Go语言程序接收请求并验证输入数据,若所有验证均通过则返回成功响应。

四、测试POST文件上传

文件上传是Web开发中的一个常见需求。Go语言中虽然没有内置的文件上传库,但通过http包可以轻松实现文件上传功能。以下是一个完整的文件上传示例:

package mainimport (    "fmt"    "net/http"    "html/template"    "log"    "io"    "os")func upload(w http.ResponseWriter, r *http.Request) {    if r.Method == "GET" {        t, _ := template.ParseFiles("upload.html")        t.Execute(w, nil)    } else if r.Method == "POST" {        err := r.ParseMultipartForm(32)  # 解析 multipart/form-data 格式的数据        if err != nil {            fmt.Println("Parse Form Error:", err)            return        }                // 获取上传的文件        file, handle, err := r.FormFile("file")        if err != nil {            fmt.Println("无法获取文件", err)            return        }        defer file.Close()                // 将文件内容保存到服务器        f, err := os.Create("./upload/" + handle.Filename)        if err != nil {            fmt.Println("创建文件失败", err)            return        }        defer f.Close()                // 复制文件内容        _, err = io.Copy(f, file)        if err != nil {            fmt.Println("复制文件失败", err)            return        }                // 打印文件信息        fmt.Printf("上传的文件信息:\n%s\n\n%s\n", handle.Header)        fmt.Printf("文件已成功上传\n")    } else {        fmt.Println("错误的请求方法")    }}func main() {    http.HandleFunc("/upload", upload)    err := http.ListenAndServe("0.0.0.0:8888", nil)    if err != nil {        log.Fatal("listenandserve:", err)    }}
  • HTML文件上传界面(upload.html):
    File Upload    
选择一个文件:

该例子展示了如何编写一个简单的文件上传程序。用户可以通过网页上传本地文件到服务器,服务器端会将文件保存到指定目录,并打印文件的相关信息。整个过程不需要安装任何额外的库。

总结

以上代码示例展示了Go语言在处理HTTP请求中的四种主要场景,包括参数获取、表单提交和文件上传。通过这些示例,开发者可以快速入门Go语言的HTTP开发,掌握基础的请求处理技能。这些建议和实现都可以在实际项目中得到广泛应用。

转载地址:http://xynxz.baihongyu.com/

你可能感兴趣的文章
基数树(radix tree)
查看>>
放硬币问题的解空间结构
查看>>
58Q游戏(4)73(5)85(6)98(7)
查看>>
独立钻石棋详解
查看>>
106 多米诺骨牌(12)119(8)130(9)142(10)150(11)
查看>>
算两次计数法
查看>>
python正则表达式一:match、search和findall
查看>>
点亮细胞171-180
查看>>
C++ Primer Plus读书笔记:c++字符串
查看>>
CSU 1757: 火车入站(区间覆盖的最大覆盖深度)
查看>>
C++ Primer Plus读书笔记:循环读取(错误处理)
查看>>
《架构师36项修炼》Mysql 异常情况下的事务安全 -- 详解 Mysql redolog
查看>>
skimage与cv2 安装失败的解决办法
查看>>
linuxmint 上面装谷歌浏览器
查看>>
windows/linux下Anaconda管理的(安装的)包的位置
查看>>
关于吴恩达的深度学习的一些授课视频里面英文翻译错误的实例展示
查看>>
伴随矩阵和逆矩阵的关系证明
查看>>
反向传播之矩阵求导dL/dz1的求导过程 普通神经网络的逆向求导过程
查看>>
numpy.linspace使用详解
查看>>
突破Bias-Variance困境
查看>>