gpt4 book ai didi

python - Golang : Get request sends me html contents but works fine from python and curl

转载 作者:行者123 更新时间:2023-12-01 21:09:21 24 4
gpt4 key购买 nike

我正在尝试使用golang调用简单的api。但是,每次它向我发送登录页面的html内容而不是实际数据时。但是同样的get请求也可以从python和curl获得。

func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://www.lrn.com", nil)
if err != nil {
os.Exit(1)
}

q := req.URL.Query()
q.Add("phoneList", "XXXXXX")
q.Add("output", "json")
q.Add("version", "5")
//req.URL.RawQuery = q.Encode()
req.Header.Set("loginId", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

fmt.Println(req.URL.String())

resp, err := client.Do(req)

if err != nil {
fmt.Println("Errored when sending request to the server")
return
}

defer resp.Body.Close()
resp_body, _ := ioutil.ReadAll(resp.Body)

fmt.Println(resp.Status)
fmt.Println(string(resp_body))
}
上面的脚本给了我登录页面的html内容。但是,如果我使用python,它就可以正常工作。
import requests

r=requests.get("https://www.lrn.com", params = {'version':'5', "phoneList":"XXXXXX", "output":"json"}, headers={"loginId":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"})

print r.text
有人可以向我解释我的golang脚本中可能有什么问题。

最佳答案

//req.URL.RawQuery = q.Encode()
req.Header.Set("loginId", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

fmt.Println(req.URL.String())
最后一行输出它使用的URL。上面的代码为 https://www.lrn.com。假设您想要查询参数,则期望值将改为 https://www.lrn.com?output=json&...。因此,URL的构造显然缺少一些内容。
激活该行时,您已明确注释掉了,结果却大不相同:
req.URL.RawQuery = q.Encode()  // activate this line
...
fmt.Println(req.URL.String())
在这种情况下,我得到 https://www.lrn.com?output=json&phoneList=XXXXXX&version=5,这是期望值。使用此值,对我来说,服务器的结果与您的Python代码相同。

但这似乎只是第一个问题。根据注释中的输入,我可以找到第二个问题,这是由服务器损坏以及Golang header 标准化导致的。根据注释,我现在使用了另一个URL https://www.dncscrub.com/app/main/rpc/scrub,其中Python代码有效,而Golang代码再次无效。
通过比较两者使用的HTTP请求并将其本质区别减小,表明服务器以区分大小写的方式错误地解释了HTTP请求 header 。这工作
GET /app/main/rpc/scrub?version=5&phoneList=2123727200 HTTP/1.1
Host: www.dncscrub.com
loginId: 0610A62F
并产生了预期的 HTTP/1.1 401 Invalid credentials。虽然这不起作用
GET /app/main/rpc/scrub?version=5&phoneList=2123727200 HTTP/1.1
Host: www.dncscrub.com
Loginid: 0610A62F
但导致重定向 HTTP/1.1 302 Found
这些请求之间的唯一区别是 loginId: ...Loginid: ...的使用。通过将HTTP header 字段区分大小写,可以清楚地确定服务器是否损坏,请参阅 Are HTTP headers case-sensitive?,该链接也链接到相关标准。
由于 req.Header.Set将规范头字段,因此无法使用它。解决方法是改用字典,这通常不是一个好主意:
req.Header["loginId"] = []string{"0610A62F"}
有关类似问题,另请参见 GoLang: Case-sensitive HTTP Headers with net/http

关于python - Golang : Get request sends me html contents but works fine from python and curl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63972678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com