Получение 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}");

//...
Другие вопросы по тегам