当前位置: 首页 > 面试题库 >

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

汤英豪
2023-03-14
问题内容

我想定义一个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无论如何都是空映射。


问题答案:

FormPostFormParseForm()仅在收到请求时使用。发送请求时,传输程序期望对数据进行正确的编码。

通过包装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- dataapplication/x-www-form-urlencoded避免与其他类型的查询交互也可能是一个好主意。



 类似资料:
  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况相关,通常不适用于Internet的全球受众。要获得使该问题更广泛适用的帮助,请访问帮助中心。 8年前关闭。 PHP有一种非常快速的方法将值附加到数组: 在python中不需要索引号的最简单方法是什么?另外,有没有一种简单的方法可以使用嵌套在字典中的列表来执行此操作,例如此PHP等效项。 问题答案:

  • 问题内容: 问题 我正在以以下方式创建一个空列表作为值的字典。 字典看起来像这样。 当我将一个值附加到一个列表时,此示例将值附加到所有列表。 问题 我的问题分为两部分。首先,为什么会这样?第二,我该怎么办?也就是说,如何将一个值仅附加到一个列表中? 我想象在创建字典时,我使所有列表都指向同一个对象。但是我不明白怎么回事,因为当我输入而不是在字典创建中,然后添加值而不是附加值时,这些值的行为会不同,

  • 问题内容: 我试图弄清楚如何在Python中将多个值附加到列表中。我知道很少有方法可以做到这一点,例如手动输入值或将附加操作放入循环中,或和函数。 但是,我想知道是否还有更整齐的方法?也许某个程序包或功能? 问题答案: 您可以使用sequence方法将列表从任意迭代类型中扩展为多个值,无论是另一个列表还是提供值序列的任何其他事物。 因此,您可以用来附加 单个 值,也可以附加 多个 值。

  • 我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定

  • 问题内容: 我正在使用Commons HttpClient对Spring servlet进行http调用。我需要在查询字符串中添加一些参数。因此,我执行以下操作: 但是,当我尝试使用读取servlet中的参数时 它返回null。实际上parameterMap是完全空的。当我在创建HttpGet请求之前将参数手动添加到url时,该参数在servlet中可用。当我使用附加了queryString的UR

  • 主要内容:获取GET请求内容,实例,实例,获取 POST 请求内容,基本语法结构说明,实例在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。 表单提交到服务器一般都使用 GET/POST 请求。 本章节我们将为大家介绍 Node.js GET/POST请求。 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。 node.js 中 url 模块中的 parse 函数提供了这个