http - 带嵌套参数的 POST 请求

标签 http go

我是 Go 的新手,所以如果这是一个微不足道的问题,我深表歉意。

我目前正在尝试编写一个函数来创建一个带有嵌套参数哈希的 POST 请求。因此,动态语言(如 javascript)中的等效调用将是:

$.post('http://example.com', {level1: {level2: 'foo'}});

在我的 Go 代码中,我目前以下列方式嵌套哈希:

func (runner *Runner) post(args... interface{}) interface{} {
    form_url := getString(args[0])
    form_data := ???

    http.PostForm(form_url, form_data)

表单数据 (interface{}) 的实际类型由第 3 方库提供,因此我无法真正更改它。

问题是 PostForm 需要一个 url.Values 类型的表单数据,定义为

type Values map[string][]string

最好的处理方法是什么?到目前为止,我的结论是我需要编写一个函数来对嵌套哈希进行 HTTP 编码并具有以下签名:

func httpEncodeNestedMap(data interface{}) map[string][]string {...}

这在 Go 中的惯用实现是什么?

谢谢。

最佳答案

基本上,在 HTTP 中没有参数本身的“嵌套”。一些系统提供了以模拟维度的方式解析查询字符串的工具。

例如,PHP 支持 [] 符号。在 PHP 中,你可以有一个像 foo[bar]=baz&foo[zar]=boo 这样的查询字符串,它将转换为一个 $_REQUEST 结构,如下所示:

 array(
     'foo' => array(
         'bar' => 'baz',
         'zar' => 'boo'
      )
 )

出于正当理由,标准 Go 库不提供此类功能。不过,您可以自行实现。

Go 支持而 PHP 不支持(至少“原生”)的是查询参数的多个值。

type Values map[string][]string

请注意任何参数名称(字符串索引)如何可以有多个值(字符串片段)。当您的查询字符串看起来像 foo=bar&foo=zar 时会发生这种情况,然后您会得到:

map[string][]string {
    "foo": {
        "bar",
        "zar"
    }
}

我希望这能解决问题。

关于http - 带嵌套参数的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240238/

相关文章:

node.js - 从 MJPEG 流中提取 JPEG 并通过 websocket 发布 base64 编码图像

go - 如何下载支持简历的文件?

gorilla/mux golang 缓存静态文件

go - golang 中的词法范围?

google-app-engine - 用于 SPA 和客户端路由的 AppEngine dispatch.yaml

java - 如何捕获 HTTP 请求并在 Java 中模拟其响应?

http - 使用具有相同值的重复响应 header 可以吗?

java - httpClient 连接未关闭

docker - 从零开始的容器说明

http - Font awesome 显示 Squares 直到它被加载