Как исправить 400 ответов, поступающих от Microsoft Azure Служба компьютерного зрения - PullRequest
0 голосов
/ 08 февраля 2020

Я подписан на Computer Vision API на RapidAPI. Когда я тестирую API на платформе RapidAPI, он работает отлично. Но когда я звоню из моего приложения, оно отвечает 400 Bad запрос.

Как я могу решить эту проблему?

Я использую библиотеку RESTSharp.

Вот мой код -

public static IRestResponse GetClassifiedImageData()
{
    var client = new RestClient("{Client Path}");
    var request = new RestRequest(Method.POST);
    request.AddHeader("x-rapidapi-host", "{Rapid API host}");
    request.AddHeader("x-rapidapi-key", "{My API key}");
    request.AddHeader("content-type", "application/json");
    request.AddHeader("accept", "application/json");
    request.AddParameter("application/json", "{\"url\":\"Image URL\"}", ParameterType.RequestBody);
    return client.Execute(request);
}

И если я вызываю асинхронно, я получаю это сообщение -

System.Runtime.CompilerServices.AsyncTaskMethodBuilder 1+AsyncStateMachineBox 1 [System.String, ComputerVision.Program + d__2]

Asyn c Code-

public static async Task<IRestResponse> GetClassifiedImageData2()
{
    var client = new RestClient("{Client Path}");
    var request = new RestRequest(Method.POST);
    request.AddHeader("x-rapidapi-host", "{Rapid API host}");
    request.AddHeader("x-rapidapi-key", "{My API key}");
    request.AddHeader("content-type", "application/json");
    request.AddHeader("accept", "application/json");
    request.AddParameter("application/json", "{\"url\":\"Image URL\"}", ParameterType.RequestBody);
    return await client.ExecuteAsync(request);
}

Я пробовал это -

  • Перезапуск Visual Studio.
  • Очистка файлов Temp и предварительной выборки.

1 Ответ

1 голос
/ 10 февраля 2020

Исходя из моего теста, именно кодировка URL вызывает проблему.

Вы можете использовать пример кода с веб-сайта Rapid API. Тем не менее, при использовании RestClient не следует urlencode urlpath. Инженер Rapid API может ошибиться здесь. В большинстве случаев символ , не обязательно должен быть закодирован. Таким образом, вы можете напрямую использовать https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories,Tags,Color,Faces,Description в качестве строки пути.

И, в любом случае, правильная закодированная строка - https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories%2cTags%2cColor%2cFaces%2cDescription

Пример кода из Rapid API: enter image description here

Я использовал образец и получил такое же сообщение об ошибке, как у вас. Но я решил это, используя исходную строку или правильную закодированную строку:

public static async Task<IRestResponse> GetClassifiedImageDataAsync()
{
    // The correct encoded string will work
    //var client = new RestClient("https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories%2cTags%2cColor%2cFaces%2cDescription");

    // The original string will work 
    var client = new RestClient("https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories,Tags,Color,Faces,Description");

    var request = new RestRequest(Method.POST);
    request.AddHeader("x-rapidapi-host", "microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com");
    request.AddHeader("x-rapidapi-key", "71a69********************************3ddb");
    request.AddHeader("content-type", "application/json");
    request.AddHeader("accept", "application/json");
    request.AddParameter("application/json", "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/1/11/Kanye_West_at_the_2009_Tribeca_Film_Festival.jpg\"}", ParameterType.RequestBody);
    return await client.ExecuteAsync(request);
}

static void Main(string[] args)
{
    var result = GetClassifiedImageDataAsync().GetAwaiter().GetResult();
    Console.WriteLine(result.Content);
}


И вы также можете использовать метод RestClient для добавления строки запроса:

public static async Task<IRestResponse> GetClassifiedImageDataAsync()
{
    // Without query string
    var client = new RestClient("https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze");

    var request = new RestRequest(Method.POST);

    // Add as query string manually
    request.AddParameter("visualfeatures", "Categories,Tags,Color,Faces,Description", ParameterType.QueryString);

    request.AddHeader("x-rapidapi-host", "microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com");
    request.AddHeader("x-rapidapi-key", "71a69********************************3ddb");
    request.AddHeader("content-type", "application/json");
    request.AddHeader("accept", "application/json");
    request.AddParameter("application/json", "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/1/11/Kanye_West_at_the_2009_Tribeca_Film_Festival.jpg\"}", ParameterType.RequestBody);
    return await client.ExecuteAsync(request);
}

И успешный результат:

enter image description here

...