Home > Software design >  REST API Custom Response query
REST API Custom Response query

Time:03-31

I am a bit new to REST API. I have the below controller created to mock an API Service called by a client code under Test. I need to return the response in JSON format as mentioned in the query and need some help to fix it.

Controller:

    [HttpPost]
    [ApiKeyAuth]
    [ValidateModel]
    [ProducesResponseType(typeof(Item), StatusCodes.Status201Created)]
    public async Task<IActionResult> AddNewItem([FromBody] Item item)
    {

        var itemId = await _repo.AddItemAsync(item);
        return CreatedAtAction(nameof(GetItemById), new { itemId, controller = "Example" },
            itemId);
    }

Contract:

public interface IExampleControllerRepository
{
    Task<int> AddItemAsync(Item item);
}

Repo:

public class ExampleRepository : IExampleControllerRepository
{
    private readonly ExampleDbContext _context;

    public ExampleRepository(ExampleDbContext context) => _context = context;

    public async Task<int> AddItemAsync(Item item)
    {
        _context.Add(item);
        await _context.SaveChangesAsync();

        return item.ItemId;
    }

}

Expected positive response template:

{"response":{"status":0,"data":[{"id":"1234"}]}}

CodePudding user response:

        // Summary:
        //     Creates a Microsoft.AspNetCore.Mvc.CreatedAtActionResult object that produces
        //     a Microsoft.AspNetCore.Http.StatusCodes.Status201Created response.
        //
        // Parameters:
        //   actionName:
        //     The name of the action to use for generating the URL.
        //
        //   routeValues:
        //     The route data to use for generating the URL.
        //
        //   value:
        //     The content value to format in the entity body.
        //
        // Returns:
        //     The created Microsoft.AspNetCore.Mvc.CreatedAtActionResult for the response.
    [NonAction]
    public virtual CreatedAtActionResult CreatedAtAction(string? actionName, object? routeValues, [ActionResultObjectValue] object? value)
    {
         throw null;
    }

The response body's template is related to the type of value, So if you want to get the response template like:

{"response":{"status":0,"data":[{"id":"1234"}]}}

You need to pass a value of a specific type instead of itemId.

Here is a simple demo.

public class Test
    {
        public List<response> responses { get; set; }
    }

public class response
    {
        public int status { get; set; }
        public List<test1> data { get; set; }
    }

public class test1
    {
        public string Id { get; set; }
    }

For testing convenience, I just hard code here.

        [HttpPost]
        [ApiKeyAuth]
        [ValidateModel]
        [ProducesResponseType(typeof(Item), StatusCodes.Status201Created)]
        public async Task<IActionResult> AddNewItem([FromBody] Item item)
        {
            Test test = new Test()
            {
                responses = new List<response>()
                {
                    new response()
                    {
                        status = 0,
                        data = new List<test1> { 
                              new test1()
                              {
                                  Id = "1234",
                              }
                        }
                    }

                }
            };
            var itemId = await _repo.AddItemAsync(item);
            return CreatedAtAction(nameof(GetItemById), new { Id = item.ItemId }, test);
        }

Result

enter image description here

  • Related