2016-06-13 1 views
0

J'essaie d'utiliser le Trustpilot API, pour publier des invitations à examiner les produits.Trustpilot OAuth Restful API: Impossible de PostAsync

J'ai passé avec succès l'étape d'authentification comme vous pouvez le voir dans le code ci-dessous, mais je ne parviens pas à envoyer des données avec succès au Trustpilot Invitations API. La méthode PostAsnyc semble être bloquée avec un statut WaitingForActivation. Je me demande s'il y a quelque chose que vous pouvez suggérer pour aider.

Voici mon code pour cela (les informations d'authentification API ici ne sont pas authentiques!):

using (HttpClient httpClient = new HttpClient()) 
{ 
    string trustPilotAccessTokenUrl = "https://api.trustpilot.com/v1/oauth/oauth-business-users-for-applications/accesstoken"; 

    httpClient.BaseAddress = new Uri(trustPilotAccessTokenUrl); 

    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); 

    var authString = "MyApiKey:MyApiSecret"; 

    httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Base64Encode(authString)); 

    var stringPayload = "grant_type=password&username=MyUserEmail&password=MyPassword"; 

    var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/x-www-form-urlencoded"); 

    HttpResponseMessage httpResponseMessage = httpClient.PostAsync(trustPilotAccessTokenUrl, httpContent).Result; 

    var accessTokenResponseString = httpResponseMessage.Content.ReadAsStringAsync().Result; 

    var accessTokenResponseObject = JsonConvert.DeserializeObject<AccessTokenResponse>(accessTokenResponseString); 

    // Create invitation object 
    var invitation = new ReviewInvitation 
    { 
     ReferenceID = "inv001", 
     RecipientName = "Jon Doe", 
     RecipientEmail = "[email protected]", 
     Locale = "en-US" 
    }; 

    var jsonInvitation = JsonConvert.SerializeObject(invitation); 

    var client = new HttpClient(); 
    client.DefaultRequestHeaders.Add("token", accessTokenResponseObject.AccessToken); 

    var invitationsUri = new Uri("https://invitations-api.trustpilot.com/v1/private/business-units/{MyBusinessID}/invitations"); 

    // This here as a status of WaitingForActivation! 
    var a = client.PostAsync(invitationsUri, new StringContent(jsonInvitation)).ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()); 
} 

Répondre

2

Voilà comment je résolu la question:

// Serialize our concrete class into a JSON String 
    var jsonInvitation = JsonConvert.SerializeObject(invitationObject); 

    // Wrap our JSON inside a StringContent which then can be used by the HttpClient class 
    var stringContent = new StringContent(jsonInvitation); 


    // Get the access token 
    var token = GetAccessToken().AccessToken; 

    // Create a Uri 
    var postUri = new Uri("https://invitations-api.trustpilot.com/v1/private/business-units/{BusinessUnitID}/invitations"); 


    // Set up the request 
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, postUri); 
    request.Content = stringContent; 
    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
    request.Content.Headers.Add("token", token); 

    // Set up the HttpClient 
    var httpClient = new HttpClient(); 
    //httpClient.DefaultRequestHeaders.Accept.Clear(); 
    //httpClient.BaseAddress = postUri; 
    //httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
    //httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US")); 

    var task = httpClient.SendAsync(request); 

    task.Wait(); 

Cette question ici sur le SO était utile: How do you set the Content-Type header for an HttpClient request?