猿问

正确处理切片和字符串

我正在使用 goRequest http://parnurzeal.github.io/gorequest/对我需要与之交谈的服务器进程发出一些 HTTP 请求。身份验证过程是这样工作的;


发送带有身份验证标头集的 GET 请求。没问题,但我需要从响应中获取标头并使用返回值重新验证每个后续请求。


重新调整的 HTTP 标头如下所示。


Response headers

map[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

非常感谢!克雷格


慕仙森
浏览 184回答 2
2回答

拉莫斯之舞

如果您想要一个值,请使用Header 的 Get 方法location := response.Header.Get("Location")这也为您规范了标题名称,因此即使使用略有不同的大写字母,您仍然可以获得一个值。http.Header当您需要获取的值多于第一个可能值时,您只需要直接索引一个值。如果您希望所有值都具有规范化的标头名称,则可以使用textproto.CanonicalMIMEHeaderKeyvals := response.Header[textproto.CanonicalMIMEHeaderKey(header)]

眼眸繁星

标头的位置是一个数组,您只需要传递Location[0]给该方法,而不仅仅是Location因为它是一个切片。话虽如此,在不检查边界的情况下对数组进行索引是不安全的,因此您可能应该这样做;if len(Location) == 1 {     logoutRequest(Location[0])} else {    // error state}最后一件事是在未来为您提供指导。你可以看出响应头对象的类型更像这样;map[string][]string(实际上,可能 []interface{} 但我不确定输出)通过看到外括号内的每个项目[]的值都包含在另一组括号中,这意味着它是一个可以包含 0 或更多的数组值。
随时随地看视频慕课网APP

相关分类

Go
我要回答