Golang中如何发送包含URL变量的POST请求到服务器

Golang中如何发送包含URL变量的POST请求到服务器 大家好

我正尝试通过PUT方法发送POST请求,将数据输入到键值存储中…如果有更好的方法,请告诉我!

PUT方法用于更新键/值对…所以我先删除键/值对,然后插入新的键/值对来替代它…

请看下面的代码:

case urv.Get("key") != "" && urv.Get("value") != "" && urv.Get("newvalue") != "": //edit the value in that key.
		toremove := false

		for i, v := range data[urv.Get("key")] {
			if v == urv.Get("value") {
				toremove = true
				if toremove == true {
					if len(data[urv.Get("key")])-1 == i {
						data[urv.Get("key")] = data[urv.Get("key")][:i]
					} else {
						data[urv.Get("key")] = append(data[urv.Get("key")][:i], data[urv.Get("key")][i+1:]...)
					}
					break
				}
			}
		}
		if !toremove {
			fmt.Fprintf(w, "Value: %v doesn't exist in the data store", urv.Get("value"))
			return
		}
		data[urv.Get("key")] = append(data[urv.Get("key")], urv.Get("newvalue"))

以上代码都能正常工作…但我不想使用data[urv.Get("key")] = append(data[urv.Get("key")], urv.Get("newvalue")),而是想使用http.POST或http.NewRequest方法通过链接发送POST请求来输入这些数据…

我有类似下面的用户输入数据

http://localhost:8080/&key=key&value=value&datatype=datatype

上面的代码很直观,它会将数据插入到映射中,使用URL中定义的键、值和数据类型…

我需要使用POST请求的原因是为了让用户选择他们想要存储的数据类型…

我在考虑类似这样的方式:

http.NewRequest("POST", "http://localhost:8080/?key="+urv.Get("key")+"?values="+urv.Get("value")+"?datatype="+urv.Get("datatype")

urv.Get函数将从URL中获取特定参数。

谢谢 🙂


更多关于Golang中如何发送包含URL变量的POST请求到服务器的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

实际上那里的if语句完全没有意义……我刚刚意识到哈哈哈,谢谢老兄!

更多关于Golang中如何发送包含URL变量的POST请求到服务器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


RipRoss:

    toremove = true
    if toremove == true {

你确定这样写没问题吗? 表情

在Go语言中,发送包含URL变量的POST请求可以使用http.NewRequest方法。以下是完整的示例代码:

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)

func main() {
    // 方法1:使用URL查询参数
    baseURL := "http://localhost:8080/"
    params := url.Values{}
    params.Add("key", "mykey")
    params.Add("value", "myvalue")
    params.Add("datatype", "string")
    
    // 创建请求
    req, err := http.NewRequest("POST", baseURL+"?"+params.Encode(), nil)
    if err != nil {
        panic(err)
    }
    
    // 发送请求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    // 读取响应
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf("Response: %s\n", body)
}

或者使用请求体发送数据:

func sendPostWithBody() {
    // 方法2:使用请求体发送表单数据
    data := url.Values{}
    data.Set("key", "mykey")
    data.Set("value", "myvalue")
    data.Set("datatype", "string")
    
    req, err := http.NewRequest("POST", "http://localhost:8080/", 
        bytes.NewBufferString(data.Encode()))
    if err != nil {
        panic(err)
    }
    
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf("Response: %s\n", body)
}

对于你的具体场景,可以这样实现:

func sendUpdateRequest(urv url.Values) {
    baseURL := "http://localhost:8080/"
    params := url.Values{}
    params.Add("key", urv.Get("key"))
    params.Add("value", urv.Get("value"))
    params.Add("datatype", urv.Get("datatype"))
    
    req, err := http.NewRequest("POST", baseURL+"?"+params.Encode(), nil)
    if err != nil {
        fmt.Printf("Error creating request: %v\n", err)
        return
    }
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("Error sending request: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    fmt.Println("POST request sent successfully")
}

在服务器端处理POST请求:

func handlePostRequest(w http.ResponseWriter, r *http.Request) {
    if r.Method != "POST" {
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
        return
    }
    
    // 从URL查询参数获取数据
    key := r.URL.Query().Get("key")
    value := r.URL.Query().Get("value")
    datatype := r.URL.Query().Get("datatype")
    
    // 或者从请求体获取数据(如果使用表单方式)
    // r.ParseForm()
    // key := r.FormValue("key")
    // value := r.FormValue("value")
    // datatype := r.FormValue("datatype")
    
    fmt.Printf("Received - Key: %s, Value: %s, DataType: %s\n", key, value, datatype)
    
    // 处理数据存储逻辑
    // data[key] = append(data[key], value)
    
    fmt.Fprintf(w, "Data received successfully")
}

这种方式允许你通过POST请求发送URL参数,同时保持数据类型的灵活性。

回到顶部