Как я могу принять и вернуть изображение в do tnet core API - PullRequest
1 голос
/ 03 февраля 2020

У меня есть базовый API do tnet, который принимает строку и возвращает код qr (как изображение). Я могу видеть изображение в браузере. У меня есть другой проект, который использует API, но я не знаю, как получить изображение

    //This the code that accepts string and retuns image as qr code
    [Route("generate")]
    [HttpGet]
    public IActionResult Process(string context = "play")
    {

        var content = context;
        var width = 200;
        var height = 200;
        var barcodeWriterPixelData = new ZXing.BarcodeWriterPixelData
        {
            Format = ZXing.BarcodeFormat.QR_CODE,
            Options = new QrCodeEncodingOptions
            {
                Height = height,
                Width = width,
                Margin = 0
            }
        };
        var memoryStream = new MemoryStream();
        var pixelData = barcodeWriterPixelData.Write(content);
        using (var bitmap = new Bitmap(pixelData.Width, pixelData.Height,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb))
        {
            var bitmapData = bitmap.LockBits(
                                        new Rectangle(0, 0, pixelData.Width, pixelData.Height),
                                        System.Drawing.Imaging.ImageLockMode.WriteOnly,
                                        System.Drawing.Imaging.PixelFormat.Format32bppRgb
                                        );
            try
            {
                System.Runtime.InteropServices.Marshal.Copy
                    (pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
            }
            finally
            {
                bitmap.UnlockBits(bitmapData);
            }
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
            memoryStream.Seek(0, SeekOrigin.Begin);




            return File(memoryStream, "image/png");

        }

    }

//This is the code that consumes the api but i don't know how to get the image from it
public class HomeController : Controller
{
   public QR_API _myapi = new QR_API();

    public async Task<ActionResult<JsonResult>> Index()
    {

        HttpClient client = _myapi.Initial();
        HttpResponseMessage res =  await client.GetAsync("generate");
        if (res.IsSuccessStatusCode)
        {
            return Json(res);
        }
        return Json("Not Working");
    }

Как вы можете видеть, я могу получить изображение в API, как я могу получить его из http rsponse message

1 Ответ

0 голосов
/ 03 февраля 2020

одна вещь, которую вы можете сделать, это прочитать ваше изображение из содержимого HttpResponseMessage как byteArray

var image = response.Content.ReadAsByteArrayAsyn c (). Result;

, а затем вернуть его как свойство byte [] в json стороне пользовательского интерфейса как

publi c byte [] barCodeImage {get; набор; }

Подробнее:

Добавьте один ответный класс dto, который будет иметь свойство изображения и другую базу свойств, которые вам необходимы, например:

    public class ResponseDTO
    {
     public int statuscode { get; set; }
     public string errormessage { get; set; }
     public string someproperty { get; set; }
     public byte[] barCodeImage { get; set; }//this one is ur image porperty
    }

, затем ваш

    public async Task<ActionResult<ResponseDTO>> Index()
    {
        var resp = new ResponseDTO() { statuscode = 200 };//creating response object
        try
        {
            HttpClient client = _myapi.Initial();
            HttpResponseMessage res = await client.GetAsync("generate");
            if (res.IsSuccessStatusCode)
            {
                HttpResponseMessage response = await client.GetAsync(builder.Uri);
                //read your image from HttpResponseMessage's content as byteArray
                var image = response.Content.ReadAsByteArrayAsync().Result;
                //Setting ur byte array to property of class which will convert into json later
                resp.barCodeImage = image;
                resp.someproperty = "some other details you want to send to UI";


            }
        }
        catch (Exception e)
        {
            //In case you got error
            resp.statuscode = 500;
            resp.errormessage = e.Message;

        }
        return resp;
    }
...