首页 > 解决方案 > 是否可以将 json 对象数组作为 URL 的参数传递?

问题描述

我正在为 Golang 中的 restAPI 实现进行单元测试。我需要将一个对象数组传递给 url。这是我拥有的结构示例:

    type version struct {
        Name string `json:"name"`
        Ver  string `json:"ver"`
    }
    
    type event struct {
        ID          string    `json:"id"`
        Title       string    `json:"Title"`
        Description string    `json:"Description"`
        Versions    []version `json:"versions"`
    }

我在邮递员中测试的示例 json 输入将如下所示

{
    "id": "101",
    "title": "This is simple Golang title for testing!",
    "Description":"Sample code for REST api implementation in Golang 2021!",
    "versions": [
            {
                "name": "pingPong",
                "ver": "10.2"
            },
            {
                "name": "Ninja",
                "ver": "10.24"
            }
    ]

}

我的问题是如何将对象数组作为 URL 参数传递。我希望有类似下面的内容,但不希望如何填充我由...突出显示的结尾部分

url?ID=20&Title=urlTitle&Description=UrlDescription&...

标签: gourlrestgoogle-app-engine-golang

解决方案


我不知道你想要的URL是什么样的,所以我自己写了一个,你可以随意更改它,让我补充一下,我不知道你有多少个版本,所以我写了这样无论你有多少版本,它都可以处理它。

package main

import (
    "fmt"
    "strings"
    "encoding/json"
)

var jsonData string =
`{
    "id": "101",
    "title": "This is simple Golang title for testing!",
    "Description":"Sample code for REST api implementation in Golang 2021!",
    "versions": [
            {
                "name": "pingPong",
                "ver": "10.2"
            },
            {
                "name": "Ninja",
                "ver": "10.24"
            }
    ]

}`

type (
    Event struct {
        Id          string    `json:"id"`
        Title       string    `json:"title"`
        Description string    `json:"description"`
        Versions    []Version `json:"versions"`
    }

    Version struct {
        Name string `json:"name"`
        Ver  string `json:"ver"`
    }
)

func fillVersions(event *Event, baseUrl string) string {
    var finalUrl string = baseUrl

    for index, value := range event.Versions {
        restUrl := fmt.Sprintf("Version%d=%s-%s", index + 1, value.Name, value.Ver)

        finalUrl = fmt.Sprintf(
            finalUrl + "%s" + "&",
            restUrl,
        )
    }
    return strings.TrimRight(finalUrl, "&")
}

func main() {
    var event Event
    json.Unmarshal([]byte(jsonData), &event)

    baseUrl := fmt.Sprintf(
        "https://test.com/test?Id=%s&Title=%s&Description=%s&",
        event.Id,
        event.Title,
        event.Description,
    )

    finalUrl := fillVersions(&event, baseUrl)

    fmt.Println(finalUrl)
}

程序的输出如下:

https://test.com/test?Id=101&Title=This is simple Golang title for testing!&Description=Sample code for REST api implementation in Golang 2021!&Version1=pingPong-10.2&Version2=Ninja-10.24

我还想说最后一个&会被删除,如果你不想这样做,删除以下行并编写如下(同时从导入范围中删除字符串库):

return strings.TrimRight(finalUrl, "&") // remove this
return finalUrl // add this

推荐阅读