【GO】3.Golang Http服务 get和post请求代码示例

  • 一.服务器端编写两个接口:PostUser,GetUser

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

type User struct {
	Name        string    `json:"Name"`
	Age         int       `json:"Age"`
	CreatedTime time.Time `json:"CreatedTime"`
	IsDeleted   bool      `json:"IsDeleted"`
}

func main() {
	http.HandleFunc("/PostUser", PostUserHandler)
	http.HandleFunc("/GetUser", GetUserHandler)
	http.ListenAndServe("localhost:9001", nil)
}

func PostUserHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method == "POST" {
		result, _ := ioutil.ReadAll(r.Body)
		r.Body.Close()
		fmt.Printf("%s\n", result)

		var user User
		json.Unmarshal([]byte(result), &user)
		fmt.Println(user)
		fmt.Fprintf(w, "Add User %s", result)
	} else {
		w.Write([]byte("Only support post"))
	}
}

func GetUserHandler(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()

	if r.Method == "GET" {
		if len(r.Form["name"]) > 0 {
			fmt.Println(r.Form["name"])
		}
		var user User
		user.Name = "dylan"
		user.Age = 32
		user.CreatedTime = time.Now()
		user.IsDeleted = true
		b, err := json.Marshal(user)
		if err != nil {
			fmt.Println("json error:", err)
		}
		fmt.Fprint(w, string(b))
	} else {
		w.Write([]byte("Only support get"))
	}
}

新建User类型进行数据传递

 

  • 二.Get方法

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"time"
)

type User struct {
	Name        string    `json:"Name"`
	Age         int       `json:"Age"`
	CreatedTime time.Time `json:"CreatedTime"`
	IsDeleted   bool      `json:"IsDeleted"`
}

func main() {
	u, _ := url.Parse("http://localhost:9001/GetUser")
	q := u.Query()
	q.Set("name", "dylan")
	u.RawQuery = q.Encode()
	res, err := http.Get(u.String())
	if err != nil {
		log.Fatal(err)
		return
	}
	result, err := ioutil.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%s", result)
}

 

  • 三.Post方法

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"time"
)

type User struct {
	Name        string    `json:"Name"`
	Age         int       `json:"Age"`
	CreatedTime time.Time `json:"CreatedTime"`
	IsDeleted   bool      `json:"IsDeleted"`
}

func main() {
	var user User
	user.Name = "dylan"
	user.Age = 32
	user.CreatedTime = time.Now()
	user.IsDeleted = true
	b, err := json.Marshal(user)
	if err != nil {
		fmt.Println("json error:", err)
	}

	body := bytes.NewBuffer([]byte(b))
	res, err := http.Post("http://localhost:9001/PostUser", "application/json;charset=utf-8", body)
	if err != nil {
		log.Fatal(err)
		return
	}
	result, err := ioutil.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%s", result)
}

 

<think> 我们正在讨论Go语言中如何获取HTTP GET请求的查询参数(即URL中问号后面的参数)。 根据引用[3],我们可以通过`r.URL.Query()`来获取GET参数,然后通过这个map-like结构来访问具体的参数值。 引用[3]中的例子:query := r.URL.Query(),然后通过索引参数名来获取值,例如uid := query["uid"][0]。注意:query["uid"]返回的是一个字符串切片([]string),因为同一个参数名可能出现多次(例如:?uid=1&uid=2)。如果我们只关心第一个值,可以取索引0。如果我们想获取单个值,可以使用query.Get("uid"),它会返回第一个值,如果不存在则返回空字符串。 因此,我们可以有两种方法: 1. 使用query.Get("参数名"):获取指定参数的第一个值(字符串)。 2. 直接使用query["参数名"]:获取指定参数的所有值(字符串切片),然后通过索引访问。 下面给出一个具体的例子: 假设我们有一个HTTP请求处理函数,其签名如下: func handler(w http.ResponseWriter, r *http.Request) 在该函数中,我们可以这样获取GET参数: 方法1(推荐,适用于单值参数): value := r.URL.Query().Get("key") 方法2(适用于多值参数): values, ok := r.URL.Query()["key"] if !ok { // 参数不存在 } // 如果存在,values是一个切片,可以遍历或按索引访问 注意:使用r.Form可以同时获取GETPOST参数(POST参数优先级更高),但如果我们只想获取GET参数,应该使用r.URL.Query()。 另外,引用[2]提到了请求头中的一些信息,但这里我们关注的是查询参数,所以不需要使用请求头。 总结:在Go中,获取GET请求的查询参数,使用http.Request的URL.Query()方法。 下面是一个完整的示例代码: ```go package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 获取名为"name"的GET参数 name := r.URL.Query().Get("name") if name == "" { fmt.Fprint(w, "Hello, anonymous!") } else { fmt.Fprintf(w, "Hello, %s!", name) } }) http.ListenAndServe(":8080", nil) } ``` 在这个例子中,当我们访问`http://localhost:8080?name=John`时,会输出"Hello, John!"。 注意:如果同一个参数名出现多次,例如`?name=John&name=Doe`,那么Get("name")将返回第一个值,即"John"。如果想获取所有值,可以使用`r.URL.Query()["name"]`,它会返回一个切片`["John", "Doe"]`。 因此,根据需求选择合适的方法。 最后,参考引用[1][2]是关于Cookie请求头的,虽然在这个问题中不是重点,但我们可以提到:如果问题涉及到Cookie,我们会使用`r.Cookie()`或`r.Cookies()`,而请求头可以通过`r.Header`来访问。但用户的问题只要求获取GET参数,所以这里不展开。 相关问题: 1.Go语言中,如何从HTTP请求中获取POST表单数据? 2.Go语言中,如何获取HTTP请求请求头信息? 3.Go语言中,如何处理同一个GET参数名对应多个值的情况? 4.Go语言中,如何设置HTTP响应的Cookie? 5.Go语言中,如何同时获取GETPOST参数?它们有什么区别? </think> 在 Go 语言中,获取 HTTP GET 请求问号后的参数(即查询字符串参数)可以通过 `http.Request` 的 `URL.Query()` 方法实现。以下是具体方法注意事项: ### 推荐方法 ```go func handler(w http.ResponseWriter, r *http.Request) { // 获取单个参数值(返回首个匹配值) uid := r.URL.Query().Get("uid") // 自动处理空值 // 获取多值参数(如 ?color=red&color=blue) colors := r.URL.Query()["color"] // 返回 []string // 直接操作 Query 对象 query := r.URL.Query() if page := query.Get("page"); page != "" { // 处理 page 参数 } } ``` ### 关键说明 1. **`URL.Query()` 方法** 返回 `url.Values` 类型(本质是 `map[string][]string`),包含所有解析后的查询参数。 2. **单值参数获取** 使用 `Get(key)` 方法返回首个值(若不存在返回空字符串): ```go id := r.URL.Query().Get("id") ``` 3. **多值参数获取** 直接索引返回字符串切片: ```go sizes := r.URL.Query()["size"] // 如 ?size=S&size=M ``` 4. **原始查询字符串** 若需未解析的原始字符串: ```go rawQuery := r.URL.RawQuery ``` 5. **与 `r.Form` 的区别** - `r.URL.Query()`:**仅获取 GET 参数** - `r.Form`:**包含 POST 表单+GET 参数**(需先调用 `r.ParseForm()`)[^3] ### 完整示例 ```go package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/search", func(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() keyword := query.Get("q") page := query.Get("page") fmt.Fprintf(w, "搜索关键词: %s, 页码: %s", keyword, page) }) http.ListenAndServe(":8080", nil) } ``` 访问 `http://localhost:8080/search?q=golang&page=3` 将输出: `搜索关键词: golang, 页码: 3` ### 注意事项 - **区分大小写**:参数名区分大小写(如 `ID` `id` 不同) - **值类型**:所有值均为字符串,数值需手动转换(如 `strconv.Atoi()`) - **特殊字符**:URL 编码会自动解码(如 `%20` 转空格) --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值