Golang中如何将字符串值作为请求体传递给第三方API的POST方法

Golang中如何将字符串值作为请求体传递给第三方API的POST方法 对于上述的POST API调用,我遇到了一个问题:无法将文件路径的网页链接作为参数传递给请求体。

   postBody, _ := json.Marshal(map[string]string{      
    "www://xyz.org/file.txt",                    

   })

   requestBody := bytes.NewBuffer(postBody)

`  resp, err := http.Post(("--POST API call--", "application/json", requestBody )
`

因此,如果requestBody能够被POST API调用获取,那么它应该允许作为参数随请求体一起传递。

但这导致了如下问题,我已附上Postman的截图,从中我们可以看到请求体传递的是null,而它本应是"www://xyz.org/file.txt"这个值。

通常,POST调用的请求体如下所示:

 postBody, _ := json.Marshal(map[string]string{
      "Key1":  "Value1",
      "key2": "Value2",
   })

但在我的情况下,如下所示,无论我调用哪个文件路径,都将其作为默认的网页URL值传递,而没有键名。

 postBody, _ := json.Marshal(map[string]string{
       "www://xyz.org/file.txt",--------> // 这里没有键,只有一个字符串值
   })

更多关于Golang中如何将字符串值作为请求体传递给第三方API的POST方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

我很奇怪为什么这对你竟然有效!给定的值不是一个映射!

如果你只想发送一个字符串,那就只发送一个字符串,而不是一个映射……

更多关于Golang中如何将字符串值作为请求体传递给第三方API的POST方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


postBody, _ := json.Marshal(map[string]string{
    "www://xyz.org/file.txt",--------> // 这里没有键,只有字符串值
})

正如 NobbZ 所说:如果你不想要一个 map[string]string,那么直接使用字符串:

postBody, _ := json.Marshal("www://xyz.org/file.txt")

它应该是一个 JSON 字符串(用双引号包围:"www://xyz.org/file.txt"),还是应该只是一个字符串(不带引号,无需转义)?

postBody := []byte("www://xyz.org/file.txt")

在Golang中,当需要将单个字符串值作为JSON请求体传递给第三方API时,你需要将其封装为JSON字符串而不是map。以下是正确的实现方式:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

func main() {
    // 方法1:直接使用字符串作为JSON值
    urlStr := "www://xyz.org/file.txt"
    postBody, _ := json.Marshal(urlStr)
    
    // 方法2:如果需要特定的JSON结构,使用结构体
    type RequestBody struct {
        URL string `json:"url"`
    }
    postBody2, _ := json.Marshal(RequestBody{URL: urlStr})
    
    // 发送请求
    requestBody := bytes.NewBuffer(postBody)
    resp, err := http.Post("https://api.example.com/endpoint", 
                          "application/json", 
                          requestBody)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    fmt.Println("Request sent successfully")
}

如果你需要传递纯字符串值(不是键值对),应该使用方法1。如果你需要键值对结构,使用方法2。

对于你原来的代码问题,json.Marshal(map[string]string{}) 期望的是键值对,而 "www://xyz.org/file.txt" 只是一个值,没有对应的键。正确的做法是:

// 如果API期望的是纯字符串值
postBody, _ := json.Marshal("www://xyz.org/file.txt")

// 如果API期望的是包含URL字段的对象
postBody, _ := json.Marshal(map[string]string{
    "url": "www://xyz.org/file.txt",
})

请根据第三方API文档的要求选择合适的数据结构。

回到顶部