In this article, we are going to discuss consuming REST API inside PowerShell and performing CRUD operations through PowerShell Script.
Agenda
- Implementation of .NET Core 6 Web API
- Create PowerShell Script and consume API to perform CRUD operation
Prerequisites
- Visual Studio 2022
- .NET Core SDK 6
- SQL Server
- PowerShell
Implementation of .NET Core 6 Web API
Here we implement a product offer application for demo purposes which is managed by the admin and performed CRUD operations
Project Structure
Step 1
Create a new .NET Core Web API
Step 2
Configure a new project
Step 3
Provide additional information
Step 4
Create an Offer class inside the Entities folder
namespace PowerShellDemo.Entities
{
public class Offer
{
public int Id { get; set; }
public string ProductName { get; set; }
public string OfferDescription { get; set; }
}
}
Step 5
Next, add DbContextClass inside the Data folder which provides a data context object to perform data-related all SQL operations
using Microsoft.EntityFrameworkCore;
using PowerShellDemo.Entities;
namespace PowerShellDemo.Data
{
public class DbContextClass : DbContext
{
protected readonly IConfiguration Configuration;
public DbContextClass(IConfiguration configuration)
{
Configuration = configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
}
public DbSet<Offer> Offer { get; set; }
}
}
Step 6
Create IProductOfferService and ProductOfferService files inside the Repositories
IProductOfferService
using PowerShellDemo.Entities;
namespace PowerShellDemo.Repositories
{
public interface IProductOfferService
{
public Task<List<Offer>> GetOfferListAsync();
public Task<Offer> GetOfferByIdAsync(int Id);
public Task<Offer> AddOfferAsync(Offer offer);
public Task<Offer> UpdateOfferAsync(Offer offer);
public Task<bool> DeleteOfferAsync(int Id);
}
}
ProductOfferService
using Microsoft.EntityFrameworkCore;
using PowerShellDemo.Data;
using PowerShellDemo.Entities;
namespace PowerShellDemo.Repositories
{
public class ProductOfferService : IProductOfferService
{
private readonly DbContextClass _dbContext;
public ProductOfferService(DbContextClass dbContext)
{
_dbContext = dbContext;
}
public async Task<List<Offer>> GetOfferListAsync()
{
return await _dbContext.Offer.ToListAsync();
}
public async Task<Offer> GetOfferByIdAsync(int Id)
{
return await _dbContext.Offer.Where(x => x.Id == Id).FirstOrDefaultAsync();
}
public async Task<Offer> AddOfferAsync(Offer offer)
{
var result = _dbContext.Offer.Add(offer);
await _dbContext.SaveChangesAsync();
return result.Entity;
}
public async Task<Offer> UpdateOfferAsync(Offer offer)
{
var result = _dbContext.Offer.Update(offer);
await _dbContext.SaveChangesAsync();
return result.Entity;
}
public async Task<bool> DeleteOfferAsync(int Id)
{
var filteredData = _dbContext.Offer.Where(x => x.Id == Id).FirstOrDefault();
var result = _dbContext.Remove(filteredData);
await _dbContext.SaveChangesAsync();
return result != null ? true : false;
}
}
}
Step 7
Next, create a new product to offer a controller
using Microsoft.AspNetCore.Mvc;
using PowerShellDemo.Entities;
using PowerShellDemo.Repositories;
namespace PowerShellDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ProductOfferController : ControllerBase
{
private readonly IProductOfferService productOfferService;
public ProductOfferController(IProductOfferService productOfferService)
{
this.productOfferService = productOfferService;
}
[HttpGet("getofferlist")]
public async Task<List<Offer>> GetOfferListAsync()
{
try
{
var response = await productOfferService.GetOfferListAsync();
return response;
}
catch
{
}
return null;
}
[HttpGet("getofferbyid")]
public async Task<Offer> GetOfferByIdAsync(int Id)
{
try
{
var response = await productOfferService.GetOfferByIdAsync(Id);
return response;
}
catch
{
}
return null;
}
[HttpPost("addoffer")]
public async Task<Offer> AddOfferAsync(Offer offer)
{
try
{
var response = await productOfferService.AddOfferAsync(offer);
return response;
}
catch
{
}
return null;
}
[HttpPut("updateoffer")]
public async Task<Offer> UpdateOfferAsync(Offer offer)
{
try
{
var response = await productOfferService.UpdateOfferAsync(offer);
return response;
}
catch
{
}
return null;
}
[HttpDelete("deleteoffer")]
public async Task<bool> DeleteOfferAsync(int Id)
{
try
{
var response = await productOfferService.DeleteOfferAsync(Id);
return response;
}
catch
{
}
return false;
}
}
}
Step 8
Later on, register a few services in the DI container inside the Program class
using PowerShellDemo.Data;
using PowerShellDemo.Repositories;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IProductOfferService, ProductOfferService>();
builder.Services.AddDbContext<DbContextClass>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
Step 9
Add the database connection string inside the appsettings.json file
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Data Source=DESKTOP;Initial Catalog=PowerShellDemo;User Id=sa;Password=database;"
}
}
Step 10
Execute the following commands which are going to create add migration and update the database
add-migration "initial"
update-database
Step 11
Finally, run web API
Create PowerShell Script and consume API to perform CRUD operation
Step 1
Open Windows PowerShell ISE and create this script
#Product Application Demo
# Define api url
$apiBaseUrl = "http://localhost:5009/api/ProductOffer"
do
{
Write-Host "================================================================================================================="
write-host "`n"
Write-Host "Following operation you can perform base on you input"
Write-Host "1) Get list of product offer"
Write-Host "2) Get product offer by offer id"
Write-Host "3) Add a new product offer"
Write-Host "4) Update existing product offer"
Write-Host "5) Delete product offer by offer id"
write-host "`n"
write-host "========================================================================================================="
$input = Read-Host "Enter action number which you want to perform from above "
write-host "`n"
try {
switch($input){
1{
#-------------------------------------------Get List of Prducts Offers--------------------------------------------------------
$offer_list_api_endpoint = $apiBaseUrl + "/getofferlist"
$offers_list = Invoke-RestMethod -Uri $offer_list_api_endpoint -Method Get -ContentType "application/json"
if($offers_list)
{
foreach($offer in $offers_list)
{
Write-Host "Following offers are available"
Write-Host $offer
write-host "`n"
}
}
else
{
Write-Host "No product offers available"
write-host "`n"
}
}
2{ #-------------------------------------------Get of Prduct Offer By ID--------------------------------------------------------
$input = Read-Host "Enter Offer ID | Ex - 1"
write-host "`n"
$get_offer_api_endpoint = $apiBaseUrl + "/getofferbyid" +"?Id=$input"
$offer = Invoke-RestMethod -Uri $get_offer_api_endpoint -Method Get -ContentType "application/json"
if($offer)
{
Write-Host $offer
write-host "`n"
}
else
{
Write-Host "Offer id not found"
write-host "`n"
}
}
3{ #-------------------------------------------Add a new product----------------------------------------------------------------
$product_description = @()
$product_description = Read-Host = "Enter the offer details | Ex- Samsung Smart TV, 5% off"
$product_description = $product_description.Split(",").Trim()
$body = @{
"id" = 0
"productName" = $product_description[0]
"offerDescription" = $product_description[1]
}| ConvertTo-Json
$header = @{
"accept" = "application/json"
"Content-Type" = "application/json"
}
$add_offer_api_endpoint = $apiBaseUrl + "/addoffer"
$added_offer = Invoke-RestMethod -Uri $add_offer_api_endpoint -Method Post -Body $body -Headers $header
if($added_offer)
{
Write-Host "Below Product Added Successfully"
Write-Host $added_offer
write-host "`n"
}
}
4{ #-------------------------------------------update product offer ----------------------------------------------------------------
$product_description = @()
$product_description = Read-Host = "Enter the offer details which you want to update | Ex- 2, Samsung Smart TV, 5% off"
$product_description = $product_description.Split(",").Trim()
$body = @{
"id" = $product_description[0]
"productName" = $product_description[1]
"offerDescription" = $product_description[2]
}| ConvertTo-Json
$header = @{
"accept" = "application/json"
"Content-Type" = "application/json"
}
$update_offer_api_endpoint = $apiBaseUrl + "/updateoffer"
$updated_offer = Invoke-RestMethod -Uri $update_offer_api_endpoint -Method Put -Body $body -Headers $header
if($updated_offer)
{
Write-Host "Below Product Offer Update Successfully"
Write-Host $updated_offer
write-host "`n"
}
}
5{ #-------------------------------------------delete product offer by id----------------------------------------------------------------
$input = Read-Host "Enter Offer ID which you want to be delete | Ex- 1"
$get_offer_api_endpoint = $apiBaseUrl + "/deleteoffer" +"?Id=$input"
$offer = Invoke-RestMethod -Uri $get_offer_api_endpoint -Method Delete -ContentType "application/json"
if($offer -eq "True")
{
Write-Host "Offer deleted successfully"
write-host "`n"
}
else
{
Write-Host "Offer id not found"
write-host "`n"
}
}
}#switch
}#try
Catch
{
Write-OUtput $_.Exception.Message
}
$isContinue = Read-Host "Do you want to continue: Y/N"
}Until($isContinue -eq "N")
- Here as you see we create five sections inside the switch case some are used for getting offers and some to add and update the offer details
- Also, we configure the base API URL in each section and invoke their endpoint after providing the body, header, and type of HTTP method.
- If you want to learn more about PowerShell like the syntaxes and installation then read Microsoft’s official document https://learn.microsoft.com/en-us/powershell/
Step 2
Finally, run your script and executes multiple operations as I have shown in below images
Conclusion
In this article, we discussed REST API and PowerShell like how to consume APIs inside PowerShell script and implementation of that with the help of .NET Core 6 and Windows PowerShell ISE.
Happy Learning!