#c# #api #httpclient #trustpilot
Вопрос:
Попытка получить отзывы Trustpilot от конкретного продукта, но ничего не получается.
Может получить токен с успехом, но тогда отзывы:
- Запрос https://api.trustpilot.com/v1/private/product-reviews/business-units/{businessUnitId}/обзоры вообще не дадут никаких результатов, но будут выполняться без ошибок
и
- Запрос https://api.trustpilot.com/v1/product-reviews/business-units/{businessUnitId}/отзывы вернут ошибку «Microsoft.VisualStudio.Услуги.OAuth.Получен отзыв о продукте AccessTokenResponseProduct.{«ошибка»:{«строка ошибки»:»Недопустимый ApiKey»,»подробности»:{«код ошибки»:»oauth.v2.Недопустимый apikey»}}}»
ApiKey-это то же самое, чтобы получить токен, поэтому не понимаю, почему здесь не работает. В отчаянной попытке добавил токен в URL (?токен={токен}) и также не увенчался успехом.
Коллекция артикулов включает в себя все варианты. Также пробовал без параметра sku, и ничего не извлекается.
Вот код:
var ApiKey = "ApiKey";
var SecretKey = "SecretKey";
var Username = "Username";
var Password = "Password";
var serverUrl = "xxx.xxx.xxx.xxx";
var BusinnessUnit = "BusinnessUnit";
var AuthUrl2 = "https://api.trustpilot.com/v1/oauth/oauth-business-users-for-applications/accesstoken";
var ReviewUrl = "https://api.trustpilot.com/v1/private/product-reviews/business-units/" bkBusinnessUnit "/reviews";
var ProductReviewUrl = "https://api.trustpilot.com/v1/product-reviews/business-units/" bkBusinnessUnit "/reviews";
var token = "";
// get token
using (var httpClient = new HttpClient())
{
try
{
httpClient.BaseAddress = new Uri(AuthUrl2);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
var authString = ApiKey ":" SecretKey;
string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(authString));
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", encodedStr);
var stringPayload = "grant_type=passwordamp;username=" Username "amp;password=" Password;
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(AuthUrl2, httpContent).Resu<
var accessTokenResponseString = httpResponseMessage.Content.ReadAsStringAsync().Resu<
var accessTokenResponseObject = JsonConvert.DeserializeObject<AccessTokenResponse>(accessTokenResponseString);
token = accessTokenResponseObject.AccessToken;
Console.WriteLine("Token retrieved. " token);
}
catch (Exception ex)
{
Console.WriteLine("Failed!" ex.ToString());
}
}
// get product reviews
using (var httpClient = new HttpClient())
{
try
{
httpClient.BaseAddress = new Uri(ProductReviewUrl);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
var authString = ApiKey ":" SecretKey;
string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(authString));
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", encodedStr);
var stringPayload = "sku=SK40132-BLK-6,SK40132-BLK-8,SK40132-BLK-10,SK40132-BLK-12,SK40132-BLK-14,SK40132-BLK-16,SK40132-BLK-18amp;token=" token;
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(ProductReviewUrl, httpContent).Resu<
var reviewResponseString = httpResponseMessage.Content.ReadAsStringAsync().Resu<
var reviewResponseObject = JsonConvert.DeserializeObject<AccessTokenResponse>(reviewResponseString);
Console.WriteLine(reviewResponseObject "Product review retrieved." reviewResponseString);
}
catch (Exception ex)
{
Console.WriteLine("Failed!" ex.ToString());
}
}
// get reviews
using (var httpClient = new HttpClient())
{
try
{
httpClient.BaseAddress = new Uri(ReviewUrl);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
var stringPayload = "sku=SK40132-BLK-6,SK40132-BLK-8,SK40132-BLK-10,SK40132-BLK-12,SK40132-BLK-14,SK40132-BLK-16,SK40132-BLK-18";
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(ReviewUrl, httpContent).Resu<
var reviewResponseString = httpResponseMessage.Content.ReadAsStringAsync().Resu<
var reviewResponseObject = JsonConvert.DeserializeObject<AccessTokenResponse>(reviewResponseString);
Console.WriteLine(reviewResponseObject "Review retrieved." reviewResponseString);
}
catch (Exception ex)
{
Console.WriteLine("Failed!" ex.ToString());
}
}
Ответ №1:
/v1/частные/обзоры продуктов/бизнес-подразделения/{businessUnitId}/отзывы для конечной точки требуется токен. Это может быть предоставлено либо через заголовок, либо через параметры запроса. Это работает на вас, так как вы сделали это правильно.
/v1/обзоры продуктов/бизнес-подразделения/{businessUnitId}/отзывы для конечной точки требуется только apikey. Вы могли бы пройти его двумя способами:
- через заголовок
HttpClient.По умолчанию требуются исполнители.Принять.Добавить(«апикей», АпиКей);
- с помощью параметров запроса
var stringPayload = «sku=SK40132-BLK-6,SK40132-BLK-8,SK40132-BLK-10,SK40132-BLK-12,SK40132-BLK-14,SK40132-BLK-16,SK40132-BLK-18amp;apikey=» АпиКей;
Комментарии:
1. Спасибо Арунас, но почему конечная точка, для которой требуется токен, не возвращает данные? Конечная точка, для которой требуется только apikey, попробовала оба способа, и ни один не сработал.
2. Он должен возвращать отзывы о продукте, если они у него есть. Попробуйте добавить
amp;page=1amp;perPage=100
в качестве дополнительных параметров запроса рядом с артикулом.3. Безрезультатно добавлены параметры страницы (с артикулом и без артикула).
Ответ №2:
Это было невероятно просто, это должна быть GetAsync, а не PostAsync.
В любом случае спасибо, что посмотрели на это.