在Go语言中,使用`net/http`包可以很方便地发送HTTP请求,包括POST请求。当需要发送raw JSON格式的参数时,通常会使用`encoding/json`包来将Go的结构体序列化为JSON字符串,然后使用`http.NewRequest`函数创建请求,并通过`http.Client`发送这个请求。
以下是一个使用Go语言发送POST请求,参数为raw JSON格式,并处理固定格式响应的示例。
首先,假设我们要发送的JSON数据如下(这里以一个简单的用户信息为例):
```json
{
"name": "John Doe",
"age": 30
}
```
对应的Go结构体可能是这样的:
```go
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
```
然后,我们假设服务器响应的固定格式如下(这里以简单的成功响应为例):
```json
{
"status": "success",
"message": "User created successfully"
}
```
对应的Go结构体可能是这样的:
```go
type Response struct {
Status string `json:"status"`
Message string `json:"message"`
}
```
现在,我们编写发送POST请求并处理响应的代码:
```go
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
// 创建一个User实例
user := User{
Name: "John Doe",
Age: 30,
}
// 将User实例序列化为JSON
userJSON, err := json.Marshal(user)
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
// 创建POST请求
resp, err := http.Post("http://example.com/api/users", "application/json", bytes.NewBuffer(userJSON))
if err != nil {
log.Fatalf("POST request failed: %s", err)
}
defer resp.Body.Close()
// 读取响应体
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Reading response body failed: %s", err)
}
// 将响应体反序列化为Response结构体
var response Response
err = json.Unmarshal(body, &response)
if err != nil {
log.Fatalf("JSON unmarshaling failed: %s", err)
}
// 打印响应
fmt.Printf("Status: %s, Message: %s\n", response.Status, response.Message)
}
```
在这个例子中,我们首先创建了一个`User`实例,并将其序列化为JSON字符串。然后,我们使用`http.Post`函数发送POST请求,其中请求体是我们刚刚序列化的JSON字符串。服务器响应后,我们读取响应体,并将其反序列化为`Response`结构体,最后打印出响应的状态和消息。
请注意,你需要将`"http://example.com/api/users"`替换为你实际要请求的URL。