Получение 401 «Несанкционированной» ошибки при использовании Google Cloud AutoML через HttpClient - PullRequest
0 голосов
/ 16 октября 2018

Я пишу приложение WPF с C #, которое пытается выполнить вызов Google Cloud AutoML API с помощью HttpClient.Я могу связаться с сервером, но всегда получаю ответ «Несанкционированный».Я изучил StackOverflow и документацию 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 Ответ

0 голосов
/ 16 октября 2018

Я не вижу заголовка Authorization, добавленного к запросу

-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"

, как в примере cURL

Установите Authorization в запросе перед отправкой

//...

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "{token-here}");

//...
...