Home > Back-end >  What can I do to handle different requests?
What can I do to handle different requests?

Time:06-14

Preface

I have created an ASP.NET Code Web API using Visual Studio 2022 to familiarise myself with the topic of "Web APIs".

Template

I have converted the project to .NET 5.

In the MyControllers.cs I have so far code for a Get and for a Post request.

I have removed the WeatherForecast.cs created by Visual Studio. I have also set in the launchSettings.json that the browser jumps to MyController from the beginning.

To practice Dependency Injection, I added another project called TextRepository (a class library) to the assembly. I had written a text file with another Visual Studio project that contains the numbers from 0–99. This text file is read in and returned in the Get method of MyController.cs. Now the numbers are displayed in the browser when called. I had also included the interface INumberRepository.

text file

To practise the whole thing again, I created another repository: ImageRepository. The aim is to find all pictures in the folder Pictures and store them in a List. To do this, I downloaded System.Drawing.Common from the NuGet package manager.

Solution Explorer

Question for you:

I am still struggling a bit to request the API in the browser for different purposes. I still want to use the call https://localhost:44355/api/My for displaying the numbers in the browser, i.e., the Get method. How can I make it so that I use a different link to transfer the image data? I am concerned with the call to the API – do I have to write a second Get function? – And about transferring the bytes of the images.

If anyone wonders what the images are: I have created 2 test images for this purpose (1920 pixels ×1080 pixels).

blue and black images

WebApplication2

in Startup.cs

services.AddScoped<TextRepository.INumberRepository, TextRepository.NumberTextFileRepository>();
services.AddScoped<ImageRepository.IImageTransferRepository, ImageRepository.ImageTransferRepository>();

MyController.cs

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using TextRepository;
using ImageRepository;

namespace WebApplication2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MyController : ControllerBase
    {
        private readonly INumberRepository numberRepository;
        private readonly IImageTransferRepository imageRepository;
        public MyController(INumberRepository numberRepository, IImageTransferRepository imageTransferRepository)
        {
            this.numberRepository = numberRepository;
            this.imageRepository = imageTransferRepository;
        }
        [HttpGet]
        public ActionResult<List<int>> Get()
        {
            List<int> numbers = this.numberRepository.GetNumbers();
            List<System.Drawing.Bitmap> foundImages = this.imageRepository.GetImages();
            return Ok(numbers);
        }
        [HttpPost]
        public IActionResult Post([FromBody] DataTransferObject transferObject)
        {
            return Ok(transferObject.PassedString   $" {transferObject.Zahl}");
        }
    }
}

TextRepository

TextFileParser.cs

using System;
using System.Collections.Generic;
using System.IO;

namespace TextRepository
{
    public class TextFileParser
    {
        public static List<int> ReadAllData(string path)
        {
            if (!File.Exists(path))
            {
                throw new FileNotFoundException(path);
            }
            string[] allLines = System.IO.File.ReadAllLines(path);
            if (allLines == null)
            {
                throw new Exception("War null");
            }
            if (allLines.Length < 1)
            {
                throw new Exception("Die Datei enthält 0 Zeilen.");
            }
            if (allLines.Length == 1)
            {
                return new List<int>();
            }
            List<int> numbers = new List<int>();
            for (int i = 1; i < allLines.Length; i  )
            {
                if (int.TryParse(allLines[i], out int result))
                {
                    numbers.Add(result);
                }
                else
                {
                    Console.WriteLine($"In der Textdatei, in Zeile {i   1}, ist eine inkorrekte Zahl aufgetreten.");
                    continue;
                }
            }
            return numbers;
        }
    }
}

NumberTextFileRepository

using System.Collections.Generic;

namespace TextRepository
{
    public class NumberTextFileRepository : INumberRepository
    {
        public List<int> GetNumbers()
        {
            System.IO.DirectoryInfo Root = new System.IO.DirectoryInfo(System.IO.Directory.GetCurrentDirectory());
            return TextFileParser.ReadAllData(Root.Parent.FullName   "\\Textdatei.txt");
        }
    }
}

INumberRepository.cs

using System.Collections.Generic;

namespace TextRepository
{
    public interface INumberRepository
    {
        List<int> GetNumbers();
    }
}

ImageTransferRepository

ImageTransferRepository.cs

using System;
using System.Collections.Generic;

namespace ImageRepository
{
    public class ImageTransferRepository : IImageTransferRepository
    {
        public List<System.Drawing.Bitmap> GetImages()
        {
            return ImageTransfer.GetImagesFromFolder(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
        }
    }
}

ImageTransfer.cs

using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ImageRepository
{
    public class ImageTransfer
    {
        public static List<System.Drawing.Bitmap> GetImagesFromFolder(string path)
        {
            if (!Directory.Exists(path))
            {
                throw new FileNotFoundException(path);
            }

            List<FileInfo> fileInfos = new List<FileInfo>();
            fileInfos.AddRange(new DirectoryInfo(path).EnumerateFiles().Where(f => IsValidFile(f)));
            fileInfos = fileInfos.OrderBy(x => x.CreationTime).ToList(); // The newest image should be at the top of the list.

            return (from FileInfo file in fileInfos select new System.Drawing.Bitmap(file.FullName)).ToList();
        }
        private static bool IsValidFile(FileInfo File)
        {
            return File.FullName.ToLower().EndsWith(".bmp") ^ File.FullName.ToLower().EndsWith(".jpeg") ^ File.FullName.ToLower().EndsWith(".jpg") ^ File.FullName.ToLower().EndsWith(".png");
        }
    }
}

IImageTransferRepository.cs

using System.Collections.Generic;
using System.Drawing;

namespace ImageRepository
{
    public interface IImageTransferRepository
    {
        List<Bitmap> GetImages();
    }
}

CodePudding user response:

I still want to use the call https://localhost:44355/api/My for displaying the numbers in the browser, i.e., the Get method. How can I make it so that I use a different link to transfer the image data? I am concerned with the call to the API – do I have to write a second Get function? – And about transferring the bytes of the images.

If you want to return List<int> numbers and List<System.Drawing.Bitmap> foundImages together,you can try to create a class which contains the two lists.Or you need to write a second Get function.

public class TestModel {
        public List<int> numbers { get; set; }
        public List<System.Drawing.Bitmap> foundImages { get; set; }

    }

Get function:

[HttpGet]
        public ActionResult<TestModel > Get()
        {   
            TestModel t=new TestModel();
            t.numbers = this.numberRepository.GetNumbers();
            t.foundImages = this.imageRepository.GetImages();
            return Ok(t);
        }

If you want to create a second Get function,here is the demo:

[HttpGet]
        public ActionResult<List<int>> Get()
        {
            List<int> numbers = this.numberRepository.GetNumbers();
            return Ok(numbers);
        }
[HttpGet("foundImages")]//route will be https://localhost:44355/api/My/foundImages 
        public ActionResult<List<System.Drawing.Bitmap>> Get()
        {
            List<System.Drawing.Bitmap> foundImages = this.imageRepository.GetImages();
            return Ok(foundImages);
        }
  • Related