Не удается получить ответ API - PullRequest
0 голосов
/ 28 января 2020

Я застрял на том, как преобразовать код python в c#. Я пытался много раз, но не получил ответ API. Сначала я попробовал это
Мой python код

import sys
import base64
import requests
import json

file_path = 'limit.jpg'
image_uri = "data:image/jpg;base64," + base64.b64encode(open(file_path, "rb").read()).decode()
r = requests.post("https://api",
    data=json.dumps({'src': image_uri}),
    headers={"app_id": "YOUR_APP_ID", "app_key": "YOUR_APP_KEY",
             "Content-type": "application/json"})
print(json.dumps(json.loads(r.text), indent=4, sort_keys=True))

Первая попытка

using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api."))
            {
                request.Headers.TryAddWithoutValidation("app_id", id);
                request.Headers.TryAddWithoutValidation("app_key",apiKey);

                request.Content = new StringContent("{ \"src\": \"data:image/jpeg;base64",PathToImage);
                request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
                var response =  httpClient.SendAsync(request).Result;
                Console.WriteLine(    await response.Content.ReadAsStringAsync());

            }
        }

Но ответ API не повезло: {"error": "SyntaxError: неожиданный конец ввода JSON", "error_info": {"id": "json_syntax" , "message": "SyntaxError: Неожиданный конец ввода JSON"}} Я также пытался конвертировать cURL -

curl -X POST https://api \
-H 'app_id: YOUR_APP_ID' \
-H 'app_key: YOUR_APP_KEY' \
-H 'Content-Type: application/json' \
--data '{ "src": "data:image/jpeg;base64,'$(base64 -i limit.jpg)'" }'

Но снова не повезло. Может, я не прав с convertbase64 из изображения .

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Код Python не объединяет строки. Что он делает:

  1. Загружает содержимое файла,
  2. Кодирует их с помощью Base64
  3. Создание URI-изображения из строки Base64
  4. Создайте словарь с ключом src и значением URI изображения.
  5. Этот словарь сериализован как JSON.
  6. Строка json отправляется в API

Точно такие же шаги в C# будут:

var data=File.ReadAllBytes(PathToImage);
var base64=Convert.ToBase64(data);
var imageUri="data:image/jpg;base64," + base64;
var json=JsonConvert.SerializeObject(new {src=imageUri});
var content=new StringContent(json,Encoding.UTF8,"application/json");

await _client.PostAsync(apiUrl,content);

Вызовы могут быть объединены , но лучше начать с чистого кода, прежде чем пытаться его сократить. Отличие от Python заключается в том, что здесь создается анонимный объект с new {src=imageUri} вместо словаря.

Экземпляры HttpClient поточно-ориентированы и предназначены для повторного использования, а не утилизации. Ключи API могут быть установлены один раз, когда создается экземпляр HttpClient, например:

_client.DefaultRequestHeaders.TryAddWithoutValidation("app_id", id);
_client.DefaultRequestHeaders.TryAddWithoutValidation("app_key",apiKey);
0 голосов
/ 28 января 2020

Я заметил, что вы передаете PathToImage (который, я считаю, имеет физический путь к файлу изображения) вместо содержимого изображения в кодировке base64. Пожалуйста, попробуйте ниже:

Отредактированный код:

request.Content = new StringContent("{ \"src\": \"data:image/jpeg;base64,",Convert.ToBase64(System.IO.File.ReadAllBytes(PathToImage)),"\" }");

Несколько исправлений syntati c, как показано ниже => Запятая отсутствует после base64. (который я добавил сейчас)

В конце вам нужно будет указать "\"} "закрыть открытые фигурные скобки с заключительными кавычками, чтобы отметить конец json object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...