Получение 401 "Несанкционированной" ошибки при использовании Google Cloud AutoML через HttpClient
Я пишу приложение WPF с C#, которое пытается выполнить вызов Google Cloud AutoML API с помощью HttpClient
, Я могу связаться с сервером, но всегда получаю ответ "Несанкционированный". Я изучил Stackru и документацию AutoML для любой подсказки о том, как правильно превратить запрос "CURL" в простой HTTP-запрос, который я могу выполнить программно в моем приложении C#, но не нашел ничего, что давало бы достаточные рекомендации по этому вопросу. точка (отсюда и мой вопрос).
Вот запрос CURL, после которого я моделирую свой HTTP-запрос:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/MyProjectId:predict -d @request.json
Есть элементы этого запроса, которые я не могу понять, как перевести на C#, а именно: Authorization: Bearer
составная часть. Нужно ли как-то найти токен и добавить его в заголовок или что-то? Если да, как мне получить этот токен в виде строки? Кажется, это то, что я действительно застрял.
И вот код C#, который у меня есть до этого момента.
public async Task<object> GetPrediction(string imagePath)
{
string apiKey = "MyApiKey";
string projectId = "MyProjectId";
HttpResponseMessage response;
byte[] img = File.ReadAllBytes(imagePath);
string jsonBody = "{\"payload\":{\"image\":{\"imageBytes\":\"" + Encoding.UTF8.GetString(imgBody) + "\"}}}";
string uri = $"https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/{projectId}:predict?key={apiKey}";
string token = “MyToken”;
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
request.Headers.Authorization = new AuthenticarionHeaderValue(“Bearer”, token);
request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
response = await client.SendAsync(request);
return Task.FromResult(response);
}
Этот код в основном устанавливает контакт, затем я возвращаю 401 "неавторизованный" код состояния. Буду признателен за любые предложения или рекомендации, и если потребуется дополнительная информация, я был бы рад опубликовать больше. Спасибо!
Обновить:
Я изменил блок кода, чтобы включить предложенное изменение от Nkosi, но я все еще вижу тот же код состояния 401.
1 ответ
Я не вижу Authorization
заголовок добавлен в запрос
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
как в примере cURL
установить Authorization
на запрос перед отправкой
//...
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "{token-here}");
//...