发布时间:2024-11-24 11:17:30
首先,我们需要通过net/http包创建一个HTTP服务器。下面是一个简单的示例代码:
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/hello", helloHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") }
上述代码中,我们使用http.HandleFunc函数将路径“/hello”与一个处理函数helloHandler绑定起来。当有HTTP请求访问该路径时,会调用helloHandler函数。该函数接收一个ResponseWriter和一个Request作为参数,在这里我们通过调用Fprintf方法将"Hello, World!"写入ResponseWriter,从而返回该字符串作为HTTP响应。 使用http.ListenAndServe函数指定监听的地址和端口,这里监听的是本地地址的8080端口。如果有新的HTTP请求到达,它将交给之前注册的处理函数处理。
现在我们来看一下如何处理HTTP请求,获取请求的数据,并将其转化为JSON格式的响应。
package main import ( "encoding/json" "fmt" "log" "net/http" ) type User struct { Name string `json:"name"` Email string `json:"email"` } func userHandler(w http.ResponseWriter, r *http.Request) { // 解析请求体中的JSON数据 var user User err := json.NewDecoder(r.Body).Decode(&user) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // 打印接收到的用户信息 fmt.Printf("Received user: %+v\n", user) // 构建响应数据 response := make(map[string]interface{}) response["message"] = "Received user successfully" // 将响应数据转化为JSON格式 responseData, err := json.Marshal(response) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 设置响应头 w.Header().Set("Content-Type", "application/json") // 发送响应数据 w.Write(responseData) } func main() { http.HandleFunc("/user", userHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }
上述代码中,我们定义了一个User结构体,有两个字段Name和Email。这里使用了struct tag指定了字段在JSON中的命名。然后通过json.NewDecoder(r.Body).Decode方法将请求体中的JSON数据解析到User结构体中。 接着,我们可以对接收到的用户信息进行处理,这里我们仅仅打印了用户信息。 然后,我们构建一个包含"message"字段的map,将其转化为JSON格式的响应数据,并设置响应头的Content-Type为"application/json",最后通过调用w.Write方法发送响应。
除了搭建HTTP服务器,Golang net/http包也提供了发送HTTP请求的功能。下面是一个示例代码,展示如何发送HTTP POST请求并解析返回的JSON数据。
package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net/http" ) type User struct { Name string `json:"name"` Email string `json:"email"` } func main() { user := User{ Name: "Alice", Email: "alice@example.com", } // 将User结构体转化为JSON格式 requestData, err := json.Marshal(user) if err != nil { log.Fatal(err) } // 发送POST请求 response, err := http.Post("http://localhost:8080/user", "application/json", bytes.NewBuffer(requestData)) if err != nil { log.Fatal(err) } // 解析响应数据 responseData, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } // 关闭响应的Body response.Body.Close() // 解码JSON数据到map var result map[string]interface{} err = json.Unmarshal(responseData, &result) if err != nil { log.Fatal(err) } // 打印响应结果 fmt.Printf("Response: %+v\n", result) }
上述代码中,我们创建了一个User结构体实例,并将其转化为JSON格式的数据。 然后,我们使用http.Post方法发送POST请求,将JSON数据发送给"http://localhost:8080/user"。发送的请求数据类型设置为"application/json",并通过bytes.NewBuffer将requestData包装为一个可读取的字节流。 我们通过调用ioutil.ReadAll方法将响应数据读取到responseData中,并通过json.Unmarshal将其解码到map类型result中。 最后,我们打印得到的响应结果。
通过golang的net/http和encoding/json包,我们可以轻松地搭建HTTP服务器和发送HTTP请求,并对JSON数据进行编码和解码。在实际的开发中,这两个包是非常实用的工具,能够帮助我们快速处理HTTP请求和响应中的JSON数据,提高开发效率。