获取正在发送的HTTP请求正文

问题描述:

我正在向基于https的API发送请求。 在Chrome中输入请求网址时,一切正常。当进行使用net/http包在走同样的要求,我得到有关失踪的子域的错误:获取正在发送的HTTP请求正文

"error": { 
    "type": "ApiUnknown", 
    "message": "No api specified (via subdomain)" 
} 

我认为Chrome和围棋不知何故将略有不同的HTTP请求,所以,我需要知道这些差异可能是。

在Chrome中,我可以使用开发人员工具查看发送的请求。

如何从http包中获取正在发送的HTTP请求正文?

我可以做到以下几点:

package main 

import (
    "net/http" 
    "os" 
) 

func main() { 
    urlStr := "https://api-name.subdomain.domain.org/page?param=value" 

    //client := &http.Client{} 
    req, err := http.NewRequest("GET", urlStr, nil) 
    if err != nil { 
     panic(err) 
    } 
    req.Write(os.Stdout) // Will this output be equal to the one being sent to the server? 
    //resp, err := client.Do(req) 
} 

输出:

GET /页PARAM =值HTTP/1.1
主持人:API-name.subdomain.domain。 org
User-Agent:Go 1.1包http

游乐场:http://play.golang.org/p/Oku0O1yiBt

但我不知道在发送之前的请求,或者这其实是所有有交通是否增加了一些。

+0

发送请求时可以设置额外的标头(例如,如果在URL中有基本授权证书,在重定向等情况下有Referer,则为授权)。你还没有真正提供很多关于你的服务器为什么拒绝你的请求的信息。 –

+0

@JamesHenstridge:是的,我认为可能是这样。不,我没有提供很多信息,因为我真的不知道。这就是为什么我想看到实际的请求主体。我使用完全相同的'urlStr'并将其粘贴到同一台计算机上的Chrome中,并得到不同的响应。我添加了Go http请求给我的实际响应。 – ANisus

+0

我可能会补充一点,虽然urlStr不是实际的url(好吧,呵呵),但它具有相同的结构。它甚至在'api-name'中有一个破折号,所以有一段时间我以为Go可能会用URL编码破折号,但事实并非如此。 – ANisus

我只是看着net/http std lib源码。正如James Henstridge已经回答的那样:可能会增加一些额外的授权和传输相关标题。但是这都是严格遵守协议的。所以我不会认为那里有什么问题。

您示例底部的代码应该确实打印出所有相关信息。现在它取决于您的具体用例为什么您的请求失败。

您是否指定了正确的子域(如错误消息所述)?

您是否有Content-Type标题集?根据您选择的子域,服务器可能会检查合适的Content-Type

这些只是我现阶段可以做出的一些假设。