Golang http Get 和 Post

本文详细探讨了Golang中HTTP客户端如何发起GET和POST请求,包括请求构造、参数传递、响应处理等关键步骤,帮助开发者深入理解Golang在网络编程中的应用。
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
    . "github.com/soekchl/myUtils"
)
func HttpPost(data_str string) {
    data_str := fmt.Sprintf("name=%s&id=%v", "Luke", 1)
    resp, err := http.Post(source_url, "application/x-www-form-urlencoded",
        strings.NewReader(data_str))
    if err != nil {
        Error(err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        Error(err)
        return
    }
    if strings.Contains(string(body), "Successful") { // 这是按照post方法的 自定义返回值判断
        Notice("数据发送成功!")
    } else {
        Error("数据发送失败!!!", string(body))
    }
}
func httpGet(reqUrl string) ([]byte, error) {
	u, _ := url.Parse(reqUrl)
	q := u.Query()
	u.RawQuery = q.Encode() //urlencode
	response, err := http.Get(u.String())
	if err != nil {
		return nil, err
	}
	if response.Body != nil {
		defer response.Body.Close()
	}
	body, err := ioutil.ReadAll(response.Body)
	if response.StatusCode != 200 {
		if len(body) > 1024 {
			body = body[:1024]
		}
		return nil, errors.New(fmt.Sprintf("获取网站数据错误 返回code=%v body=%s", response.StatusCode, body))
	}
	return body, nil
}

 

 

Golang 中,标准库 `net/http` 并不支持直接发送带有 POST body 的 GET 请求。根据 HTTP 协议的标准定义,GET 方法通常用于获取资源,而不应附带请求体。然而,在某些特殊场景下,可能需要实现这种非标准的行为。 为了实现这一需求,可以手动创建一个自定义的 HTTP 请求对象并指定其 Method Body 属性[^3]。以下是具体实现方式: ### 手动构建带有 POST body 的 GET 请求 ```go package main import ( "bytes" "fmt" "io/ioutil" "net/http" ) func main() { // 定义请求的目标 URL url := "https://example.com/api" // 创建请求体(JSON 或其他格式) body := []byte(`{"key":"value"}`) // 构建一个新的 GET 请求,并附加请求体 req, err := http.NewRequest("GET", url, bytes.NewBuffer(body)) if err != nil { panic(err) } // 设置必要的请求头 req.Header.Set("Content-Type", "application/json") // 使用默认客户端发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() // 读取响应内容 responseBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response:", err) return } // 输出响应状态码内容 fmt.Printf("Response Status Code: %d\n", resp.StatusCode) fmt.Printf("Response Body: %s\n", responseBody) } ``` 以上代码展示了如何通过 `http.NewRequest` 来创建一个 GET 请求,并为其附加请求体。需要注意的是,这种方式并不符合 HTTP 标准协议的规定,因此可能会被部分服务端拒绝处理或引发意外行为。 --- ### 注意事项 1. **服务端兼容性**:并非所有的服务端都会接受带有请求体的 GET 请求。如果目标 API 不允许此类操作,则需改用更合适的 HTTP 方法(如 POST)。 2. **安全性问题**:GET 请求的设计初衷是为了安全性幂等性,而加入请求体会破坏这些特性。建议仅在必要时使用此方法。 3. **替代方案**:对于复杂的数据传输需求,推荐优先考虑采用 POST 请求或其他适合的方法[^1]。 --- #### 参考链接 - 更多关于 Go 语言中的 HTTP 请求配置可参见官方文档[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值