
本文共 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
该代码实现了一个登录界面,用户需要填写相关信息后提交表单。服务器端通过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开发,掌握基础的请求处理技能。这些建议和实现都可以在实际项目中得到广泛应用。
发表评论
最新留言
关于作者
