使用HttpWebRequest添加自定义标头

19

我不太确定这些突出显示的值是哪种类型的标头,但我应该如何使用HttpWebRequest添加它们?

HTTP Header

这里突出显示的部分是 HTTP 请求的正文还是标头数据?换句话说,哪一种方法是正确的?

这是我目前正在使用的代码:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("/securecontrol/reset/passwordreset");
request.Headers.Add("Authorization", "Basic asdadsasdas8586");
request.ContentType = "application/x-www-form-urlencoded";
request.Host = "www.xxxxxxxxxx.com";
request.Method = "POST";
request.Proxy = null;
request.Headers.Add("&command=requestnewpassword");
request.Headers.Add("&application=netconnect");

但是我应该使用以下内容来构建上述 HTTP 请求吗?

string reqString = "&command=requestnewpassword&application=netconnect";
byte[] requestData = Encoding.UTF8.GetBytes(reqString);

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("/securecontrol/reset/passwordreset");
request.Headers.Add("Authorization", "Basic ashAHasd87asdHasdas");
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestData.Length;
request.Proxy = null;
request.Host = "www.xxxxxxxxxx.com";
request.Method = "POST";

using (Stream st = request.GetRequestStream())
st.Write(requestData, 0, requestData.Length);

你的第一段代码应该没问题,但为了验证数据确实在标题中,你有尝试在 Wireshark 或类似的工具中查看数据包吗?在 Wireshark 中,你可以右键点击数据包,选择在新窗口中打开,然后展开“超文本传输协议”部分。 - Lander
@M. Babcock:它们不同,我已经在代码中更改了值。 - Tarik
@Lander:我正在使用非常安全的服务器,并且实际代码非常庞大,测试起来需要花费一些时间,不幸的是:/ - Tarik
2个回答

23

一个简单的创建服务、添加头信息和读取JSON响应的方法,

private static void WebRequest()
{
    const string WEBSERVICE_URL = "<<Web Service URL>>";
    try
    {
        var webRequest = System.Net.WebRequest.Create(WEBSERVICE_URL);
        if (webRequest != null)
        {
            webRequest.Method = "GET";
            webRequest.Timeout = 20000;
            webRequest.ContentType = "application/json";
            webRequest.Headers.Add("Authorization", "Basic dcmGV25hZFzc3VudDM6cGzdCdvQ=");
            using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
            {
                using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
                {
                    var jsonResponse = sr.ReadToEnd();
                    Console.WriteLine(String.Format("Response: {0}", jsonResponse));
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

太好了!这正是我需要的标题。谢谢你。 - Vippy
很高兴能帮助@Vippy - SharK
这个很好用,但在我的情况下,我需要做以下操作:myHttpWebRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password"))); - user890332

13

在我看来,这被视为畸形的标题数据。

实际上,您希望将这些名称值对作为请求内容发送(这是POST方式的工作方式),而不是作为头信息

第二种方法是正确的。


好的,谢谢。我同意你的观点,我只是想确保自己做得没问题。 - Tarik
1
虽然这可能不是最佳实践,但在某些情况下发送HTTP请求中的头部信息是必要的,特别是在使用某些API时。 - nmg49

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接