REST API에 사용하는 HttpClient가 있습니다. 그러나 인증 헤더를 설정하는 데 문제가 있습니다. OAuth 요청을 통해받은 토큰으로 헤더를 설정해야합니다. 다음을 제안하는 .NET 코드가 있습니다.
httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token);
그러나 Credential 클래스는 WinRT에 존재하지 않습니다. 누구나 승인 헤더를 설정하는 방법에 대한 아이디어가 있습니까?
답변
이를 수행하는 방법은 다음과 같습니다.
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "Your Oauth token");
답변
request.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Basic", Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
$"{yourusername}:{yourpwd}")));
답변
이 문제를 해결하는 좋은 방법을 찾고 있으며 같은 질문을보고 있습니다. 이 답변이 같은 문제를 가진 모든 사람들이 나를 좋아하도록 도울 수 있기를 바랍니다.
using (var client = new HttpClient())
{
var url = "https://www.theidentityhub.com/{tenant}/api/identity/v1";
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
var response = await client.GetStringAsync(url);
// Parse JSON response.
....
}
https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi 에서 참조
답변
성능 및 포트 소진 문제에 대해 HttpClient 인스턴스를 재사용 하는 것이 좋습니다. 이 답변을 제공하는 답변이 없기 때문에 (그리고 나쁜 습관으로 이어질 수도 있습니다 :()) 여기에 내가 작성한 답변에 대한 링크를 넣었습니다. 비슷한 질문에 :
https://stackoverflow.com/a/40707446/717372
HttpClient를 올바르게 사용하는 방법에 대한 일부 소스 :
답변
TheWhiteRabbit의 답변에 동의하지만 HttpClient를 사용하여 많은 호출을하면 코드가 약간 반복적이라고 생각합니다.
나는 대답을 조금 향상시키는 두 가지 방법이 있다고 생각합니다.
클라이언트를 작성하기위한 헬퍼 클래스를 작성하십시오.
public static class ClientHelper
{
// Basic auth
public static HttpClient GetClient(string username,string password)
{
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));
var client = new HttpClient(){
DefaultRequestHeaders = { Authorization = authValue}
//Set some other client defaults like timeout / BaseAddress
};
return client;
}
// Auth with bearer token
public static HttpClient GetClient(string token)
{
var authValue = new AuthenticationHeaderValue("Bearer", token);
var client = new HttpClient(){
DefaultRequestHeaders = { Authorization = authValue}
//Set some other client defaults like timeout / BaseAddress
};
return client;
}
}
용법:
using(var client = ClientHelper.GetClient(username,password))
{
//Perform some http call
}
using(var client = ClientHelper.GetClient(token))
{
//Perform some http call
}
확장 메소드를 작성하십시오.
뷰티 상을 수상하지는 않지만 훌륭하게 작동합니다. 🙂
public static class HttpClientExtentions
{
public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
{
return new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.Encoding.ASCII.GetBytes(
$"{username}:{password}")));
}
}
용법:
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password);
}
다시 한 번 위의 2 가지 옵션을 사용하면 클라이언트가 명령문을 조금 덜 반복적으로 사용할 수 있다고 생각합니다. http 호출을 여러 번 수행하는 경우 HttpClient를 재사용하는 것이 가장 좋은 방법이지만이 질문의 범위를 벗어난 것으로 생각합니다.
답변
무기명 토큰을 설정하고있었습니다
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
한 엔드 포인트에서는 작동했지만 다른 엔드 포인트에서는 작동하지 않았습니다. 문제는에 소문자가 있다는 것 b
입니다 "bearer"
. 변경 후 이제 두 API 모두에서 작동합니다. 바늘을 찾기 위해 건초 더미 중 하나로 간주하지 않는다면 놓치기 쉬운 것입니다.
"Bearer"
자본 이 있어야 합니다.
답변
나는 당신에게 제안합니다 :
HttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");
그런 다음 다음과 같이 사용할 수 있습니다.
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
responseMessage = await response.Content.ReadAsAsync<ResponseMessage>();
}