J'ai le code suivant:
...
AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue("OAuth2", Contract.AccessToken);
string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders);
return result;
...
public static async Task<string> AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter);
HttpResponseMessage response = await client.PostAsync(new Uri(url), data);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
La réponse = attendre la partie continue juste une boucle en cours et rien ne se passe. Des idées sur ce que je fais mal?
La question est vraiment de savoir comment envoyer l'en-tête suivant:
Authorization: OAuth2 ACCESS_TOKEN
vers une API Web externe
Cette ligne
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(authValue.Parameter);
Produira cette valeur d'en-tête
Authorization: ACCESS_TOKEN
Où ACCESS_TOKEN
est la valeur de authValue.Parameter
. Vous souhaitez attribuer la valeur que vous avez transmise à la place pour obtenir l'en-tête requis
client.DefaultRequestHeaders.Authorization = authValue;
Produira
Authorization: OAuth2 ACCESS_TOKEN
J'ai eu du mal avec ça. J'ai continué à recevoir une erreur disant "format invalide" car j'ai une implémentation personnalisée et l'en-tête d'autorisation est validé par rapport à certaines normes. L'ajout de l'en-tête de cette façon a cependant fonctionné:
var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
J'ai eu un problème similaire lors de l'obtention d'AuthenticationHeaderValue pour fonctionner avec mes demandes. J'utilisais également JWT JsonWebToken de GitHub. J'ai pu obtenir un jeton de l'API, mais j'avais du mal à l'utiliser dans d'autres GET et POST.
var jwt = JsonWebToken.Encode(token, APISECRET, JwtHashAlgorithm.HS256);
var tk = GetTokenFromApi(); // basically returns an encrypted string.
Utilisation manuelle de WebRequest: qui a bien fonctionné.
request.ContentType = "application/json";
request.Method = "POST";
request.Headers.Set("Authorization", string.Format("Bearer {0}", tk));
Lorsque nous sommes passés à un HttpClient et avons utilisé AuthenticationHeaderValue, nous n'avons pas pu comprendre comment le configurer correctement. Joué avec les paramètres, et cela a finalement fonctionné.
var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);
Peut-être intéressant pour d'autres personnes. Depuis que je cherchais ça depuis longtemps. Mais vous devez également enregistrer vos cookies et les transmettre à votre prochaine demande. Tout d'abord, c'est ainsi que j'ai obtenu mon code d'authentification et que mes cookies sont stockés dans une variable statique (la première fois que j'appelle cette méthode, je donne une valeur vide au jeton).
public static CookieContainer CookieContainer;
public static async Task<string> Post<TRequest>( TRequest requestBody, string path, string token = "")
{
var baseUrl = new Uri($"urlFromApi");
CookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
using(var client = new HttpClient(handler){BaseAddress = baseUrl})
{
client.DefaultRequestHeaders.ConnectionClose = false;
if (!string.IsNullOrWhiteSpace(token))
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
}
ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute using (var content = new ByteArrayContent(GetByteData(requestBody)))
using (var content = new ByteArrayContent(GetByteData(requestBody)))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await client.PostAsync(String.Empty, content);
return await GetResponseContent(response);
}
}
}
Après cela, si je fais une demande à l'API, j'inclus les cookies (le jeton est ce que vous obtenez à la suite de la première réponse).
var baseUrl = $"https://innoviris-ai.collibra.com/rest/2.0{path}";
using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
using (var client = new HttpClient(handler) {BaseAddress = new Uri(baseUrl)})
{
client.DefaultRequestHeaders.ConnectionClose = false;
if (!string.IsNullOrWhiteSpace(token))
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
}
ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute
var response = await client.GetAsync(String.Empty);
return await GetResponseContent(response);
}
}