我正在尝试将用户名和密码传递到以下网址:
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请求,这是必需的。令牌将作为响应对象中“授权”字段的值返回。我想知道如何打印令牌。 statusDescription,statusCode也打印OK,告诉我我有正确的请求,但无法在响应中找到auth令牌。在指导我如何在返回的POST响应的Authorization字段中访问auth令牌时,将非常感谢任何帮助。
答案 0 :(得分:3)
您是否尝试从HttpHeader
对象获取Authorization
的{{1}}值?
您可以使用例如使用LINQ:
IRestResponse
哪个收益
var authroizationHeaderFromResponse = resp.Headers.FirstOrDefault(h => h.Name == "Authorization");
if (authroizationHeaderFromResponse != null)
{
Console.WriteLine(authroizationHeaderFromResponse.Value);
}
您认为如果响应状态代码为INVALID CREDENTIALS
,则必须有一个响应正文。
文档具体是否表明您应该期望响应正文中的令牌?
D& B开发人员可以根据需要发送没有响应正文的200 - OK
响应,或者他们可以在其他位置添加序列化令牌(JSON,XML等),例如:在标题字段中。
此代码中的一个示例可以从ASP.NET Web API中看到,它返回成功PUT的响应
200 - OK
这将在响应正文中返回200 - OK并带有序列化对象(result.Data),但是我更改以下内容没有任何问题
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;
}
类似
var response = Request.CreateResponse(HttpStatusCode.Created, dto);
这样你仍然可以获得200 - OK响应,但没有响应体。这当然违反了HTTP/1.1 Standard对PUT动词的建议,但它仍然有用。
我甚至可以为咯咯地笑。
var response = Request.CreateResponse(HttpStatusCode.Created);
你仍然可以获得200 - OK的回复。有点邪恶,但可能。
我建议尝试从设置了throw new HttpResponseException(HttpStatusCode.Created);
和x-dnb-user
标头字段的其他资源中获取数据,然后检查是否返回了响应正文。也许D&amp; B在实现这些标题字段时受到基本认证的启发,因此要求它们出现在每个请求中?
值得一试。
让我知道这是怎么回事。
答案 1 :(得分:1)
查看IRestResponse的Headers集合。它可能在那里而不是内容。
H个 奥利
答案 2 :(得分:0)
可能是AUTHTOKEN带回了cookie,因为这是一种常见的方法。
在这种情况下,您需要将CookieContanier附加到IRestClient,然后此容器将存储Cookie。如果您为后续请求使用相同的客户端,则该身份验证cookie将允许您进入。
private CookieContainer _cookieJar;
...
_cookieJar = new CookieContainer();
_client.CookieContainer = _cookieJar;
然后,您可以在请求后检查容器
_client.PostAsync(MyRequest, (r, h) =>
{
r.Cookies... // inspect em