我正在尝试将用户名和密码传递到以下 URL:
https://maxcvservices.dnb.com/rest/Authentication
根据文档,必须将 user_id 和密码作为标头传递给密钥:分别为 x-dnb-user、x-dnb-pwd。
到目前为止,我有以下代码似乎可以工作,但我无法检索响应对象返回的身份验证令牌:
public static void Main (string[] args)
{
var client = new RestClient ("https://maxcvservices.dnb.com/rest/Authentication");
var request = new RestRequest (Method.POST);
request.AddHeader("x-dnb-user", myEmail);
request.AddHeader("x-dnb-pwd", myPassword);
IRestResponse resp = client.Execute(request);
var content = resp.Content;
Console.WriteLine (resp.StatusDescription);
Console.WriteLine (resp.StatusCode);
}
当我尝试打印内容时,我得到一个空行,但我真正期待的是服务返回的身份验证令牌。我认为我在代码中做的几件事(但不确定)是在 POST 请求中将用户 ID 和密码作为标头传递,这是必需的。令牌作为响应对象中“授权”字段的值返回。我想知道如何打印令牌。此外,statusDescription、statusCode 都打印 OK,这告诉我我有正确的请求,但无法在响应中找到身份验证令牌。如果能指导我如何在返回的 POST 响应的授权字段中访问授权令牌,我们将不胜感激。
所以你试图从
HttpHeader
对象中获取 Authorization
的 IRestResponse
值?
您可以为此使用 LINQ:
var authroizationHeaderFromResponse = resp.Headers.FirstOrDefault(h => h.Name == "Authorization");
if (authroizationHeaderFromResponse != null)
{
Console.WriteLine(authroizationHeaderFromResponse.Value);
}
哪个收益
INVALID CREDENTIALS
你假设如果响应状态码是
200 - OK
,那么一定有一个伴随它的响应体。
文档是否具体声明您应该期望响应主体中有一个令牌作为回报?
D&B 开发人员可以根据需要发送一个没有响应主体的
200 - OK
响应,或者他们可以在其他地方添加他们的序列化令牌(JSON、XML 等),例如在标题字段中。
可以在 ASP.NET Web API 的代码中看到这方面的示例,该代码从成功的 PUT 返回响应
if (result.Success)
{
var dto = Mapper.Map<TEntity, TDto>(result.Data as TEntity);
var response = Request.CreateResponse(HttpStatusCode.Created, dto);
var uri = Url.Link("DefaultApi", new {id = dto.Id});
response.Headers.Location = new Uri(uri);
return response;
}
这将在响应正文中返回一个 200 - OK 和一个序列化对象 (result.Data),但是我更改以下内容没有任何问题
var response = Request.CreateResponse(HttpStatusCode.Created, dto);
类似的东西
var response = Request.CreateResponse(HttpStatusCode.Created);
这样你仍然会得到 200 - OK 的响应,但没有响应主体。这当然违反了 HTTP/1.1 标准 对 PUT 动词的建议,但它仍然有效。
我什至可以为了咯咯笑而这样做
throw new HttpResponseException(HttpStatusCode.Created);
你仍然会得到 200 - OK 的响应。有点邪恶,但可能。
我建议尝试使用
x-dnb-user
和 x-dnb-pwd
标头字段集从另一个资源中获取数据,然后检查是否返回了响应主体。也许 D&B 在实现这些标头字段时受到基本身份验证的启发,因此要求它们出现在每个请求中?
值得一试
让我知道结果如何。
查看 IRestResponse 的 Headers 集合。它可能会在那里而不是内容。
Hth 奥利
AUTHTOKEN 可能会返回 cookie,因为这是一种常见的方法。
在这种情况下,您需要将 CookieContanier 附加到您的 IRestClient,然后此容器将存储 cookie。如果您对后续请求使用相同的客户端,则该身份验证 cookie 会让您进入。
private CookieContainer _cookieJar;
...
_cookieJar = new CookieContainer();
_client.CookieContainer = _cookieJar;
然后您可以在请求后检查容器
_client.PostAsync(MyRequest, (r, h) =>
{
r.Cookies... // inspect em