为了账号安全,请及时绑定邮箱和手机立即绑定

正确处理切片和字符串

正确处理切片和字符串

Go
慕仙森 2021-11-08 16:11:29
我正在使用 goRequest http://parnurzeal.github.io/gorequest/对我需要与之交谈的服务器进程发出一些 HTTP 请求。身份验证过程是这样工作的;发送带有身份验证标头集的 GET 请求。没问题,但我需要从响应中获取标头并使用返回值重新验证每个后续请求。重新调整的 HTTP 标头如下所示。Response headersmap[Location:[900767244] Content-Type:[application/xml] Date:[Fri, 18     Sep 2015 18:19:41 GMT] Server:[Apache] X-Frame-Options:[SAMEORIGIN] Set-Cookie:[JSESSIONID=D5C976F5646365FF030DBAD770DA774C; Path=/; Secure; HttpOnly]]我需要获取该位置值,因为它是我的会话令牌。如果我像这样抓住它:session, ok := response.Header["Location"]if !ok {    fmt.Println("Did not receive a location header.")}fmt.Println("Session: ", session)我可以得到它,但它是一个切片而不是一个字符串。如何将该值作为字符串获取,以便我可以将其弹回到我的请求标头中?正如您在以下错误中看到的:./login.go:133: cannot use session (type []string) as type string in argument to logoutRequest.Delete非常感谢!克雷格
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

如果您想要一个值,请使用Header 的 Get 方法

location := response.Header.Get("Location")

这也为您规范了标题名称,因此即使使用略有不同的大写字母,您仍然可以获得一个值。

http.Header当您需要获取的值多于第一个可能值时,您只需要直接索引一个值。如果您希望所有值都具有规范化的标头名称,则可以使用textproto.CanonicalMIMEHeaderKey

vals := response.Header[textproto.CanonicalMIMEHeaderKey(header)]


查看完整回答
反对 回复 2021-11-08
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

标头的位置是一个数组,您只需要传递Location[0]给该方法,而不仅仅是Location因为它是一个切片。话虽如此,在不检查边界的情况下对数组进行索引是不安全的,因此您可能应该这样做;


if len(Location) == 1 {

     logoutRequest(Location[0])

} else {

    // error state

}

最后一件事是在未来为您提供指导。你可以看出响应头对象的类型更像这样;map[string][]string(实际上,可能 []interface{} 但我不确定输出)通过看到外括号内的每个项目[]的值都包含在另一组括号中,这意味着它是一个可以包含 0 或更多的数组值。


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信