如何使用 HttpClient 将哈希值作为标头发送? [复制]

Posted

技术标签:

【中文标题】如何使用 HttpClient 将哈希值作为标头发送? [复制]【英文标题】:How to send Hash Value as a Header Using HttpClient? [duplicate] 【发布时间】:2017-02-08 09:00:46 【问题描述】:

我正在尝试将支付平台集成到我的 Web 应用程序中,但查询交易的要求之一是使用 get 请求将散列值(某些变量的)作为标头发送。这是我尝试过的:

string hashcode = "3409877" + "117" + "D3D1D05AFE42AD508";
var hashedBytes = SHA512.Create().ComputeHash(Encoding.UTF8.GetBytes(hashcode));
// Get the hashed string.  
var hash = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
hash = hash.ToString().ToUpper();
var amount_kobo = Convert.ToInt32(model.TransactionAmount * 100);
string url = "https://sandbox.interswitchng.com/collections/api/v1/gettransaction.json?productid=117&transactionreference=" + model.TransactionReference + "&amount=" + amount_kobo;

using (var client = new HttpClient())


#if DNX451
    // ignore server certificate error
    //ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) =>  return true; ;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
#elif DNXCORE50
    // no implementation for the target DNX
#endif
    client.BaseAddress = new Uri(url);
    client.DefaultRequestHeaders.Accept.Clear();


client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
    client.DefaultRequestHeaders.Add("Hash",hash);


    HttpResponseMessage response = await client.GetAsync(url);
    string responsestr = "";
    if (response.IsSuccessStatusCode)
    
        responsestr = await response.Content.ReadAsStringAsync();
        return Json(new  success = true, response = responsestr, hash = hash );
    

但我的哈希没有发送,当我在发送请求后检查浏览器时,我没有看到我的哈希标头,也应该将标头作为哈希类型发送,但我不知道该怎么做。

我已尝试将此行更改为:

 client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("hash"));

还是不行。

更新 这是浏览器中请求标头的屏幕截图 Request headers

似乎我的标头根本没有发送。

【问题讨论】:

【参考方案1】:

尝试改用client.DefaultRequestHeaders.Add("Hash", hash)

您的代码尝试添加 Accept 请求标头,用于指定响应可接受的媒体类型。

【讨论】:

那不行,我用浏览器中显示的请求标头更新了我的答案,但我的哈希标头不存在...什么可能阻止我的标头被发送? 非常感谢,删除了客户端。DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("hash"));行,它起作用了。【参考方案2】:

将哈希转换为字符串后,您的字符串可能包含限制在GET 请求中发送的字符。所以你应该考虑在发送之前使用Uri.EscapeDataString()函数对字符串进行编码:

hash = Uri.EscapeDataString(hash);

或者converthashedBytes转Base64 和encode 后面只有几个符号

【讨论】:

以上是关于如何使用 HttpClient 将哈希值作为标头发送? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4.3.3 HttpClient:如何从响应的标头中获取值?

无法使用 Angular 7 将授权标头发送到节点 11/Express 4 服务器

如何在 Blazor WASM 客户端中访问 Httpclient 标头

如何使 HttpClient 忽略 Content-Length 标头

如何将HTTP标头添加到URL

更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值