带括号的HttpClient自定义标头-C#
我必须连接到一个RESTAPI,它需要许多不同的头。其中一个给我带来了一个问题,因为它的名称在括号内-头名称是“(请求目标)” 这是我的代码,但当我点击要添加此值的行时,会显示“标题名称格式无效” 我试过了带括号的HttpClient自定义标头-C#,c#,.net,visual-studio,httpclient,C#,.net,Visual Studio,Httpclient,我必须连接到一个RESTAPI,它需要许多不同的头。其中一个给我带来了一个问题,因为它的名称在括号内-头名称是“(请求目标)” 这是我的代码,但当我点击要添加此值的行时,会显示“标题名称格式无效” 我试过了 client.DefaultRequestHeaders.TryAddWithoutValidation("(request-target)", "host date"); 它没有失败-但我的页眉数计数不包括此页眉。我试过这段代码-它给了我关于“头名称格式无效”的相同错误 谁能告诉我在我发
client.DefaultRequestHeaders.TryAddWithoutValidation("(request-target)", "host date");
它没有失败-但我的页眉数计数不包括此页眉。我试过这段代码-它给了我关于“头名称格式无效”的相同错误
谁能告诉我在我发疯之前该怎么做
谢谢你的帮忙
进一步更新
他们提供了一个java代码,用于提取标题详细信息,名称中肯定包含括号。标头用于构建一个字符串,该字符串使用数字证书中的密钥进行签名
public String buildStringToBeSigned(HttpServletRequest request, List<String> signatureHeaders) {
Integer counter = 0;
StringBuilder sb = new StringBuilder();
for (String s : signatureHeaders) {
counter++;
if ("(request-target)".equalsIgnoreCase(s)) {
sb.append(s + ": " + request.getMethod().toLowerCase()
+ " " + request.getRequestURI() + (counter < signatureHeaders.size() ? "\n" : ""));
}else{
sb.append(s + ": " + request.getHeader(s) + (counter < signatureHeaders.size() ? "\n" : ""));
}
}
return sb.toString();
}
公共字符串buildStringToDesign(HttpServletRequest请求,列出签名头){
整数计数器=0;
StringBuilder sb=新的StringBuilder();
用于(字符串s:签名负责人){
计数器++;
如果(“(请求目标)”.equalsIgnoreCase){
sb.append(s+“:”+request.getMethod().toLowerCase()
+“+request.getRequestURI()+(计数器
因此,在HttpHeaders
类中,当您调用DefaultRequestHeaders.Add时,它调用一个名为CheckHeaderName
的私有方法
在这里面,它对您案例中的头键进行验证(请求目标)
。
首先,它检查它是否为空,然后检查名为TokenLength
的内容。基本上,此检查将遍历头键的每个字符,并检查一组令牌字符。不允许使用以下char
s:
40
41
60
62
64
44
59
58
92
34
47
91
93
63
61
123
125
字符(
和)
都等于40
和41
因此,在.Net framework中,上面的任何字符都不允许使用头键
调用TryAddWithoutValidation
时,也会调用TokenLength
检查TryAddWithoutValidation
如果将标头添加到集合中,也会返回bool,因此您可以在代码中使用该bool查看是否已添加标头
注意:这是根据.Net Framework 4.7.2进行检查的
更新:
因为查看.Net核心源代码更容易,所以我也查看了一下,看看有没有什么变化,逻辑也差不多
您可以看到不允许的值
它检查头键是否具有从调用的值,因为它将返回false,因为它包含无效字符,异常将被抛出。您确定这是头,还是意味着您应该用“请求目标”替换它?我怀疑是否有人会用如此明显无效的头来构建API。Hi-过程的一部分,是将所有头放入签名字符串中。他们提供了Java代码,用于提取头细节以构建字符串。我现在就发布这个。在我看来,它仍然可能是一个占位符,让你插入你的“请求目标”是什么。至少我希望是这样,当一个服务使用非正统约定(DataX,我在看你)时,我真的很讨厌。从那时起我得到了确认——他们在签名字符串中使用它,但在标题中没有。这里的文档非常混乱,或者我需要学习更多的术语!!花了一整天的时间来编写代码。好吧,那就不好了。您是否知道Java是否允许使用这些括号?我要回现场看看他们是否能澄清。感谢您花时间回答-非常感谢。@AnnR我不了解Java抱歉。问题是它不是一个有效的头。如果没有括号,它将是有效的。如果这回答了你的问题,请将此标记为答案。杰米,我在绿色的勾号上打了勾-对吗。第一次海报!你的回答很有启发性。再次感谢。这是正确的@AnnR谢谢!抱歉,无法解决您的问题,但希望您现在能够朝着正确的方向前进。欢迎来到StackOverflow!
public String buildStringToBeSigned(HttpServletRequest request, List<String> signatureHeaders) {
Integer counter = 0;
StringBuilder sb = new StringBuilder();
for (String s : signatureHeaders) {
counter++;
if ("(request-target)".equalsIgnoreCase(s)) {
sb.append(s + ": " + request.getMethod().toLowerCase()
+ " " + request.getRequestURI() + (counter < signatureHeaders.size() ? "\n" : ""));
}else{
sb.append(s + ": " + request.getHeader(s) + (counter < signatureHeaders.size() ? "\n" : ""));
}
}
return sb.toString();
}
40
41
60
62
64
44
59
58
92
34
47
91
93
63
61
123
125