Golang实现简单的POST请求

Golang实现简单的POST请求 我有示例代码

func MakeRequest() {

formData := url.Values{
	"name": {"masnun"},
}

resp, err := http.PostForm("https://httpbin.org/post.php", formData)
if err != nil {
	log.Fatalln(err)
}

var result map[string]interface{}

json.NewDecoder(resp.Body).Decode(&result)

log.Println(result["form"])
}

如果我的参数是字符串形式,例如:

var url string = "https://httpbin.org/post.php"
var param string = "lastname=Voucher&company_name=Fredy&address=Alcap

如何正确编码并发送POST请求?


更多关于Golang实现简单的POST请求的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

感谢Yamil,我现在尝试这段代码

更多关于Golang实现简单的POST请求的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我认为你可以使用 url.parseQuery 从查询字符串中获取切片形式的数据

m, _ := url.ParseQuery(`array=10&array=11`)
fmt.Println(m["array"][0], m["array"][1])

firstname=ghbdtn rfr ltkf&email=mymail.ru&lastname=vdsvsdvvs&company_name=sdv&address=sdc&password=1234321&reg_user=1

感谢您的回答,就我而言,参数是字符串形式,我现在只是无法正确实现POST请求。

你可以将其转换为切片。例如 🙂

str := "firstname=ghbdtnrfrtkf&email=mymail.ru&lastname=vdsvsdvvs&company_name=sdvaddress=sdcpassword=1234321&reg_user=1"
x := strings.Split(str, "&")
urlData := url.Values{}
for _, value := range x{
a := strings.Split(value, "=")
urlData.Set(a[0], a[1])
}
fmt.Println(urlData)
func main() {

var s, _ = url.ParseQuery("firstname=ghbdtn rfr ltkf&email=mymail.ru&lastname=vdsvsdvvs&company_name=sdv&address=sdc&password=1234321&reg_user=1")




req, _ := http.PostForm("https://shop.vidict.net/register.php", s)
req.Header.Set("content-type", "application/x-www-form-urlencoded")





defer req.Body.Close()
}

我尝试了这段代码但是不工作))

您提供的示例代码已经展示了如何使用http.PostForm发送表单数据,但如果您需要处理字符串形式的参数,可以使用http.Post方法并手动设置内容类型。以下是针对您的情况的解决方案:

首先,将参数字符串转换为io.Reader类型,并设置正确的Content-Type头为application/x-www-form-urlencoded。这里是一个完整的示例:

package main

import (
    "bytes"
    "encoding/json"
    "io"
    "log"
    "net/http"
    "strings"
)

func MakeRequestWithStringParams() {
    url := "https://httpbin.org/post"
    param := "lastname=Voucher&company_name=Fredy&address=Alcap"

    // 创建请求体
    body := strings.NewReader(param)

    // 发送POST请求
    resp, err := http.Post(url, "application/x-www-form-urlencoded", body)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    // 解析响应
    var result map[string]interface{}
    if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
        log.Fatalln(err)
    }

    log.Println(result["form"])
}

如果参数字符串需要进一步编码(例如处理特殊字符),可以使用url.Values来构建和编码参数。以下是另一种方法:

func MakeRequestWithEncodedParams() {
    url := "https://httpbin.org/post"
    param := "lastname=Voucher&company_name=Fredy&address=Alcap"

    // 解析参数字符串为url.Values
    values, err := url.ParseQuery(param)
    if err != nil {
        log.Fatalln(err)
    }

    // 编码为字符串并创建请求体
    encodedParams := values.Encode()
    body := strings.NewReader(encodedParams)

    resp, err := http.Post(url, "application/x-www-form-urlencoded", body)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    var result map[string]interface{}
    if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
        log.Fatalln(err)
    }

    log.Println(result["form"])
}

对于更精细的控制,可以使用http.NewRequest

func MakeRequestWithCustomRequest() {
    url := "https://httpbin.org/post"
    param := "lastname=Voucher&company_name=Fredy&address=Alcap"

    body := strings.NewReader(param)
    
    req, err := http.NewRequest("POST", url, body)
    if err != nil {
        log.Fatalln(err)
    }
    
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    var result map[string]interface{}
    if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
        log.Fatalln(err)
    }

    log.Println(result["form"])
}

这些方法都能正确处理字符串形式的参数并发送POST请求。第一个示例最简洁,直接使用http.Post;第二个示例提供了参数编码;第三个示例提供了最大的灵活性。

回到顶部