2 votes

Comment gérer les requêtes imbriquées avec un restclient en c# ?

J'ai déjà le code suivant pour poster une demande :

string requestString = "https://api.bimobject.com/search/v1/products?Bearer_token=" + AccesToken + "&filter.brand.id="+BrandID;
var client = new RestClient(requestString);
var request = new RestRequest(Method.GET);
request.AddHeader("Cache-Control", "no-cache");

IRestResponse response = client.Execute(request);

Maintenant, je voudrais ajouter un jeton d'authentification, qui prend le format suivant selon la documentation :

     "auth": {
        "bearer": [
           {
              "key": "token",
              "value": "374bfdca122189f8c98e41ccd7a30212",
              "type": "string"
           }
        ],
        "type": "bearer"
     },

Je ne suis pas certain de la façon de procéder. Il semble s'agir d'un paramètre imbriqué, mais je n'ai aucune idée de la façon d'ajouter un paramètre imbriqué de ce type. J'ai déjà vu que

request.AddParameter("auth:bearer:[key:token,value:374bfdca122189f8c98e41ccd7a30212,type:string])

Alors, comment dois-je m'y prendre ?

2voto

Peut-être que vous devez passer le jeton à travers les en-têtes HTTP comme ceci :

Authorization: Bearer your-token

Un contexte supplémentaire sur ce que vous essayez d'accomplir serait bienvenu, comme des liens vers la documentation si le service que vous interrogez est gratuit ou si les requêtes POST nécessitent le jeton dans le corps de la requête.

2voto

Nkosi Points 95895

Sur la base de l'échantillon de jeton dans l'exemple, et en supposant que cette valeur est stockée dans le fichier AccessToken variable,

Tout ce que vous devez faire est d'ajouter le Authorization à la demande.

string requestString = "https://api.bimobject.com/search/v1/products?filter.brand.id=" + BrandID;
var client = new RestClient(requestString);
var request = new RestRequest(Method.GET);
request.AddHeader("Cache-Control", "no-cache");
//Assuming AccessToken = 374bfdca122189f8c98e41ccd7a30212 value in sample JSON
request.AddHeader("Authorization", $"Bearer {AccessToken}");

IRestResponse response = client.Execute(request);

Si l'on réutilise le client, une option supplémentaire serait de créer un fichier IAuthenticator classe dérivée

public class BearerAuthenticator : IAuthenticator {
    private readonly string authHeader;

    public BearerAuthenticator(string accessToken) {
        if (accessToken == null)
            throw new ArgumentNullException("accessToken");

        authHeader = $"Bearer {accessToken}";
    }

    public void Authenticate(IRestClient client, IRestRequest request) {
        // only add the Authorization parameter if it hasn't been added by a previous Execute
        if (!request.Parameters.Any(p => p.Type.Equals(ParameterType.HttpHeader) &&
                                         p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase)))
            request.AddParameter("Authorization", authHeader, ParameterType.HttpHeader);
    }
}

Et l'attribuer au client

string requestString = "https://api.bimobject.com/search/v1/products?filter.brand.id=" + BrandID;
var client = new RestClient(requestString);
client.Authenticator = new BearerAuthenticator(AccessToken);

var request = new RestRequest(Method.GET);
request.AddHeader("Cache-Control", "no-cache");

IRestResponse response = client.Execute(request);

Maintenant, le Authorization sera ajouté à toutes les requêtes effectuées par ce client (à condition que la requête ne comporte pas déjà cet en-tête).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X