将表单值附加到 Go 中的 GET/POST 请求

2024-04-07

我想定义一个http.Client自动将表单值附加到所有 GET/POST 请求。

我天真地尝试实施http.RoundTripper从另一个库复制/粘贴时使用此技术来修改每个请求的标头。

type Transport struct {
    // Transport is the HTTP transport to use when making requests.
    // It will default to http.DefaultTransport if nil.
    // (It should never be an oauth.Transport.)
    Transport http.RoundTripper
}

// Client returns an *http.Client that makes OAuth-authenticated requests.
func (t *Transport) Client() *http.Client {
    return &http.Client{Transport: t}
}

func (t *Transport) transport() http.RoundTripper {
    if t.Transport != nil {
        return t.Transport
    }
    return http.DefaultTransport
}

func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
    // To set the Authorization header, we must make a copy of the Request
    // so that we don't modify the Request we were given.
    // This is required by the specification of http.RoundTripper.
    req = cloneRequest(req)
 >> req.Form.Set("foo", bar)

    // Make the HTTP request.
    return t.transport().RoundTrip(req)
}

// cloneRequest returns a clone of the provided *http.Request.
// The clone is a shallow copy of the struct and its Header map.
func cloneRequest(r *http.Request) *http.Request {
    // shallow copy of the struct
    r2 := new(http.Request)
    *r2 = *r
    // deep copy of the Header
    r2.Header = make(http.Header)
    for k, s := range r.Header {
        r2.Header[k] = s
    }
    return r2
}

然而这不起作用。这req.Form值映射在现阶段似乎不存在,所以我感到恐慌:panic: runtime error: assignment to entry in nil map

我尝试将其添加到(t *Transport) RoundTrip,但没有运气:

err := req.ParseForm()
misc.PanicIf(err)

我不知道我在做什么,有什么建议吗?

编辑:尝试复制是没有意义的req.Form值在cloneRequest方法,因为r.Form反正是空地图。


Form, PostForm, and ParseForm()仅在收到请求时使用。发送请求时,传输层期望数据被正确编码。

通过包装你就有了正确的想法RoundTrip,但是你必须自己处理编码数据。

if req.URL.RawQuery == "" {
    req.URL.RawQuery = "foo=bar"
} else {
    req.URL.RawQuery = req.URL.RawQuery + "&" + "foo=bar"
}

或者:

form, _ = url.ParseQuery(req.URL.RawQuery)
form.Add("boo", "far")
req.URL.RawQuery = form.Encode()

您还可以选择检查url.Values如果您想避免重复密钥,请事先这样做。检查Content-Type标题为multipart/form-data or application/x-www-form-urlencoded避免与其他类型的查询交互可能也是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将表单值附加到 Go 中的 GET/POST 请求 的相关文章

随机推荐

  • 使用自定义配置在调试模式下运行 sbt 项目

    我想使用特殊配置在我的 sbt 0 11 项目中引入调试模式 我尝试使用以下代码来实现这一点 但不幸的是 它似乎没有按预期工作 我正在启动debug run但运行并未按预期暂停 object Test extends Build lazy
  • 如何在 Windows 10 上解锁詹金斯

    我使用下载的 msi 在我的 Windows 10 机器上安装了 jenkins 它安装得很好 现在启动了浏览器 提示我使用初始管理员密码解锁詹金斯 我在任何地方都找不到这个文件 我查看了安装目录 C Program Files x86 J
  • 在 ControllerAdvice 之前捕获反序列化异常

    这是一个问题 我有一个采用输入模型的控制器 可以说 public class AppUserUpdateData NotNull Size min 1 max 50 protected String login JsonDeserializ
  • 处理 String.getBytes("UTF-8") 中的 UnsupportedEncodingException 的推荐方法

    建议的处理方式是什么不支持的编码异常 http docs oracle com javase 6 docs api java io UnsupportedEncodingException html在库方法中调用 String getByt
  • 如何更改 Paginator 的页面名称?

    Current Paginator正在使用 page N 但我想用别的东西 我怎样才能改变成这样 sida N反而 我看过Illuminate Pagination Environment并且有一个方法 setPageName 在那里改变它
  • 从浏览器调用 Android 应用程序

    我一直在尝试从浏览器调用我的应用程序安卓 3 1 蜂窝 这些是我尝试过的链接 但没有一个有效 a href click me 1 a a href click me 2 a a href click me 3 a 对于第一个和第二
  • 鼠标悬停/悬停效果在 IE8 上缓慢

    我注意到在 IE8 中 当在包含许多行 本例中为 100 行 的表上使用鼠标悬停事件时 性能会出现奇怪的情况 我尝试了很多不同的方法 但我似乎找不到任何方法来按照我喜欢 需要的速度获得它 如果我在每个事件上切换类 则所有 IE 版本的性能都
  • 为什么 JavaScript 在普通浏览器中没有自己的线程?

    JavaScript 不是多线程还不够 显然 JavaScript 甚至没有自己的线程 而是与大量其他东西共享一个线程 即使在大多数现代浏览器中 JavaScript 通常也与绘画 更新样式和处理用户操作处于同一队列中 这是为什么 根据我的
  • 使用 Joda Time 进行 Grails 控制器单元测试

    当我有一个带有 Joda LocalDateTime 字段的域对象时 一些生成所有创建的控制器测试失败 grails create app bugdemo cd bugdemo grails create domain class Item
  • 立即返回弹簧网通量

    我正在尝试创建应该返回 201 响应的框架 当向 API 发出请求时 我想立即发回响应并在后台处理该请求 Flux fromIterable request getApiRequests log flatMap item gt WebCli
  • 正确的 Javascript 继承

    我想知道是否可以在javascript中继承构造函数 在下面的例子中 我想要Moveable分派x and y论点this x and this y分别如我所定义Sprite 另外 在不创建祖先实例的情况下定义原型的最佳方法是什么 但仍然简
  • Django 无法加载静态文件

    对 django 来说是全新的 在我的 settings py 文件中 我有 STATIC URL static INSTALLED APPS django contrib admin django contrib auth django
  • 如何将我的 Sqlite 数据库移植到 GAE?

    我的本地硬盘中有一个 SQLite 格式的数据库 我希望将数据库升级到 GAE 以便我可以使用它来创建某些很酷的网络应用程序 我已经四处浏览寻找一种方法来做到这一点 然而 大多数可用的项目都是将GAE中的数据库备份到我的本地硬盘 是否有现有
  • 将 Clojure 函数作为 java.util.Function 传递

    正如在主题中一样 我想使用一个以 Function 作为参数的 Java 方法 并为其提供一个Clojure函数 无论是匿名函数还是常规函数 任何人都知道如何做到这一点 java util function Function是一个接口 您需
  • 如何向 jfreechart 创建的图表添加缩放功能

    我使用 jfree 绘制了 XY 图表 现在我想为其添加缩放功能 这必须使用图表底部的滑块来完成 如何添加 Windows 照片查看器中提供的缩放功能 另外 当用户将鼠标悬停在绘制的线上时 我想将图表的当前 Y 值显示为工具提示 我没有得到
  • redirect_uri 不属于应用程序

    类似的问题和答案都没有解决我的问题 我有两个 Facebook 应用程序 一个是另一个的测试版本 因此它们几乎相同 我测试时没有任何问题 但在实时应用程序上 我收到 redirect uri 不属于应用程序 错误 这个申请就是一个很好的例子
  • 矢量化和尴尬并行之间有什么关系?

    这个问题说明了一切 在我看来 矢量化与令人尴尬的并行问题密切相关 换句话说 所有可矢量化的程序都必须是极其并行的程序 它是否正确 对令人尴尬的并行性的快速总结 一个代码是尴尬地平行如果代码可以毫不费力地并行化 特别是处理数据依赖性 请注意
  • 如何将焦点设置到 NSButton?

    I m writing a small menubar application for OS X Yosemite When clicking on the menubar icon a popover appears with a num
  • 类模板可以在没有成员的情况下实例化吗?

    The 维基百科文章 http en wikipedia org wiki Template metaprogramming说 实例化类模板不会导致其成员定义被实例化 我无法想象 C 中的任何类被实例化 无论是否从模板中 类成员也没有被实例
  • 将表单值附加到 Go 中的 GET/POST 请求

    我想定义一个http Client自动将表单值附加到所有 GET POST 请求 我天真地尝试实施http RoundTripper从另一个库复制 粘贴时使用此技术来修改每个请求的标头 type Transport struct Trans