Veebirakenduste loomine API päringute abil

Loomine project

Vali ASP.NET Core web API

muuta https to http

uue mudeli lisamiseks tuleb lisada uus kontroller Project nimi->Controllers

NÄITEKS PrimitiividController

using Microsoft.AspNetCore.Mvc;

namespace veeb.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class PrimitiividController : ControllerBase
    {

        // GET: primitiivid/hello-world
        [HttpGet("hello-world")]
        public string HelloWorld()
        {
            return "Hello world at " + DateTime.Now;
        }

        // GET: primitiivid/hello-variable/mari
        [HttpGet("hello-variable/{nimi}")]
        public string HelloVariable(string nimi)
        {
            return "Hello " + nimi;
        }

        // GET: primitiivid/add/5/6
        [HttpGet("add/{nr1}/{nr2}")]
        public int AddNumbers(int nr1, int nr2)
        {
            return nr1 + nr2;
        }

        // GET: primitiivid/multiply/5/6
        [HttpGet("multiply/{nr1}/{nr2}")]
        public int Multiply(int nr1, int nr2)
        {
            return nr1 * nr2;
        }

        // GET: primitiivid/do-logs/5
        [HttpGet("do-logs/{arv}")]
        public void DoLogs(int arv)
        {
            for (int i = 0; i < arv; i++)
            {
                Console.WriteLine("See on logi nr " + i);
            }
        }
    }
}

Funktsioonide kirjeldus

    [HttpGet("hello-world")]
    public string HelloWorld()
    {
        return "Hello world at " + DateTime.Now;
    }

väljastab hello world ja taotluse täitmise aja.

Hello-variable name

        [HttpGet("hello-variable/{nimi}")]
        public string HelloVariable(string nimi)
        {
            return "Hello " + nimi;
        }

kirjutate oma nime ja nad ütlevad tere.

AddNumbers pluss 2 väärtust, mille me määrasime

        [HttpGet("add/{nr1}/{nr2}")]
        public int AddNumbers(int nr1, int nr2)
        {
            return nr1 + nr2;
        }

Multiply korrutab kaks etteantud väärtust

        [HttpGet("multiply/{nr1}/{nr2}")]
        public int Multiply(int nr1, int nr2)
        {
            return nr1 * nr2;
        }

DO-LOGS sisestage väärtus ja logid kuvatakse eraldi aknas

        [HttpGet("do-logs/{arv}")]
        public void DoLogs(int arv)
        {
            for (int i = 0; i < arv; i++)
            {
                Console.WriteLine("See on logi nr " + i);
            }
        }

ToodeController

Lisa uu model

ja lisada siia klassid, millega me töötame.

GetToode Toode nimekirja vaade

        public Toode GetToode()
        {
            return _toode;
        }

Suurenda-hinda +1 hinnale

        [HttpGet("suurenda-hinda")]
        public Toode SuurendaHinda()
        {
            _toode.Price += 1;
            return _toode;
        }

Muuta-aktivsus muudab IsActive väärtust (false or true)

        [HttpGet("muuda-aktiivsust")]
        public Toode MuudaAktiivsust()
        {
            _toode.IsActive = !_toode.IsActive;
            return _toode;
        }

Muuda nimi muudub väärtus «name»

        [HttpGet("muuda-nime/{name}")]
        public Toode MuudaNime(string name)
        {
            _toode.Name = name;
            return _toode;
        }

Korruta hind — korrutab hinna sisestatud arvuga

        [HttpGet("korruta-hinda/{multiplier}")]
        public Toode KorrutaHinda(double multiplier)
        {
            _toode.Price *= multiplier;
            return _toode;
        }

Tooted Controller selles kontrolleris luuakse list, millest võetakse väärtused ja andmed.

        private static List<Toode> _tooted = new()
        {
            new Toode(1,"Koola", 1.5, true),
            new Toode(2,"Fanta", 1.0, false),
            new Toode(3,"Sprite", 1.7, true),
            new Toode(4,"Vichy", 2.0, true),
            new Toode(5,"Vitamin well", 2.5, true)
        };

Kustuta index eemaldab lehtedelt väärtused indeksi järgi

        [HttpDelete("kustuta/{index}")]
        public List<Toode> Delete(int index)
        {
            _tooted.RemoveAt(index);
            return _tooted;
        }

Lisa toode lisab uue toote, mille kõik väärtused tuleb sisestada, ja tagastab lehe lisatud tootega.

        public List<Toode> Add(int id, string nimi, double hind, bool aktiivne)
        {
            Toode toode = new Toode(id, nimi, hind, aktiivne);
            _tooted.Add(toode);
            return _tooted;
        }

Hind-dolaritesse

muudab hinda, korrutades määra

        [HttpPatch("hind-dollaritesse/{kurss}")]
        public List<Toode> UpdatePrices(double kurss)
        {
            for (int i = 0; i < _tooted.Count; i++)
            {
                _tooted[i].Price = _tooted[i].Price * kurss;
            }
            return _tooted;
        }

Iseseisvad tööd

Tee juhuslike numbrite generaator (või Random rand = new Random() abil) — sisestades otspunktile kaks arvu, tagastab programm juhusliku arvu nende vahel

        [HttpGet("juhuslik/{min}/{max}")]
        public ActionResult<int> GetRandomNumber(int min, int max)
        {
            if (min > max)
            {
                return BadRequest("Min peaks olema väiksem või võrdne Max.");
            }

            int randomNumber = _random.Next(min, max + 1);
            return randomNumber;
        }

Sisesta sünniaasta otspunktile ning programm tagastab sulle lause, mis ütleb: «oled nii või naa aastat vana (arvutuslikult korrektselt), olenevalt kas sellel aastal on sünnipäev juba olnud»

        [HttpGet("synniaasta/{year}")]
        public ActionResult<string> CalculateAge(int year)
        {
            int currentYear = DateTime.Now.Year;
            int age1 = currentYear - year;
            int age2 = age1 - 1;

            if (year > currentYear || year <= 0)
            {
                return BadRequest("Palun sisesta kehtiv sünniaasta.");
            }

            bool hasHadBirthdayThisYear = DateTime.Now.DayOfYear >= new DateTime(currentYear, 1, 1).DayOfYear;
            int actualAge = hasHadBirthdayThisYear ? age1 : age2;

            string response = $"Oled {actualAge} aastat vana.";
            return response;
        }

Tee kasutaja mudel, milles on: täisarvuline ID, sõnaline kasutajanimi, sõnaline parool, sõnaline eesnimi, sõnaline perenimi.

    public class Kasutaja
    {
        public int Id { get; set; }
        public string Kasutajanimi { get; set; }
        public string Parool { get; set; }
        public string Eesnimi { get; set; }
        public string Perenimi { get; set; }

        public Kasutaja(int id, string kasutajanimi, string parool, string eesnimi, string perenimi)
        {
            Id = id;
            Kasutajanimi = kasutajanimi;
            Parool = parool;
            Eesnimi = eesnimi;
            Perenimi = perenimi;
        }
    }

Tee uus API otspunkt, mis käivitades muudab toote aktiivsust. Kui alguses on true, siis false peale ning kui on false, siis true peale. Kasuta hüüumärgi funktsionaalsust ehk ära küsi muutujana uut väärtust.

    [HttpGet("muuda-aktiivsust")]
    public Toode MuudaAktiivsust()
    {
        _toode.IsActive = !_toode.IsActive;
        return _toode;
    }

Tee uus API otspunkt, mis käivitades muudab toote nime. Võta selleks kasutusele URL muutuja ning määra tootele.

        [HttpGet("muuda-nime/{name}")]
        public Toode MuudaNime(string name)
        {
            _toode.Name = name;
            return _toode;
        }

Tee uus API otspunkt, mis käivitades muudab toote hinda muutujana antud numbri kordseks. Võta selleks kasutusele URL muutuja ning korruta toote hinnaga läbi.

        [HttpGet("korruta-hinda/{multiplier}")]
        public Toode KorrutaHinda(double multiplier)
        {
            _toode.Price *= multiplier;
            return _toode;
        }

Tee uus API otspunkt, mis kustutab korraga kõik tooted.

        [HttpDelete("kustuta-koik")]
        public ActionResult DeleteAll()
        {
            _tooted.Clear();
            return Ok("Kõik tooted on kustutatud.");
        }

Tee uus API otspunkt, mis muudab kõikide toodete aktiivsuse väära peale.

        [HttpPut("muuda-koik-vaara")]
        public ActionResult VahetaTrue()
        {
            foreach (var toode in _tooted)
            {
                toode.IsActive = false;
            }
            return Ok("Kõik toodete aktiivsus on nüüd väära.");
        }

Tee uus API otspunkt, mis tagastab ühe toote — vastavalt kelle järjekorranumber on lisatud URL muutujasse.

    [HttpGet("{index}")]
    public ActionResult<Toode> GetProductByIndex(int index)
    {
        if (index < 0 || index >= _tooted.Count)
        {
            return NotFound("Toode määratud indeksiga ei leitud.");
        }

        return _tooted[index];
    }

Tee uus API otspunkt, mis tagastab ühe toote — kõige suurema hinnaga toote.

        [HttpGet("korgeim-hind")]
        public ActionResult<Toode> SuuremHind()
        {
            if (!_tooted.Any())
            {
                return NotFound("Tooted ei ole saadaval.");
            }

            var suuremhind = _tooted.OrderByDescending(toode => toode.Price).FirstOrDefault();
            return suuremhind;
        }

Lisa react app

npx create-react-app frontend lisada react meie projekti käsu konsooli kaudu

cd frontend -> npm start reaktori käivitamiseks

lisada need andmed programmile Program.cs

app.UseCors(options => options
    .WithOrigins("*")
    .AllowAnyMethod()
    .AllowAnyHeader()
);

App.js

import { useEffect, useRef, useState } from 'react';
import './App.css';

function App() {
    const [tooted, setTooted] = useState([]);
    const idRef = useRef();
    const nameRef = useRef();
    const priceRef = useRef();
    const isActiveRef = useRef();


    useEffect(() => {
        fetch("http://localhost:5173/tooted")
            .then(res => res.json())
            .then(json => setTooted(json));
    }, []);

    function kustuta(index) {
        fetch("http://localhost:5173/tooted/kustuta/" + index, { "method": "DELETE" })
            .then(res => res.json())
            .then(json => setTooted(json));
    }

    ////////////////////////
    function lisa() {
        const uusToode = {
            "id": Number(idRef.current.value),
            "name": nameRef.current.value,
            "price": Number(priceRef.current.value),
            "isActive": isActiveRef.current.checked
        }
        fetch(`http://localhost:5173/Tooted/lisa/
        ${ nameRef.current.value } / ${Number(priceRef.current.value)}/${isActiveRef.current.checked}`, {"method": "POST"})
            .then(res => res.json())
            .then(json => setTooted(json));
    }
    ////////////////////////

    function dollariteks() {
        const kurss = 1.1;
        fetch("http://localhost:5173/tooted/hind-dollaritesse/" + kurss, { "method": "PATCH" })
            .then(res => res.json())
            .then(json => setTooted(json));
    }

    return (
        <div className="App">
            <label>ID</label> <br />
            <input ref={idRef} type="number" /> <br />
            <label>Nimi</label> <br />
            <input ref={nameRef} type="text" /> <br />
            <label>Hind</label> <br />
            <input ref={priceRef} type="number" /> <br />
            <label>Aktiivne</label> <br />
            <input ref={isActiveRef} type="checkbox" /> <br />
            <button onClick={() => lisa()}>Lisa</button>
            {tooted.map((toode, index) =>
                <div>
                    <div>{toode.id}</div>
                    <div>{toode.name}</div>
                    <div>{toode.price}</div>
                    <button onClick={() => kustuta(index)}>x</button>
                </div>)}
            <button onClick={() => dollariteks()}>Muuda dollariteks</button>
        </div>
    );
}

export default App;

App.css ma Olen lisanud saidile kujunduse.

.App {
    text-align: center;
}

.table-container {
    margin: 20px auto;
    max-width: 800px;
    overflow: auto;
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}

.table {
    width: 100%;
    border-collapse: collapse;
    background-color: white;
}

    .table th, .table td {
        padding: 12px 15px;
        text-align: left;
    }

    .table th {
        background-color: black;
        color: white;
    }

    .table tr:nth-child(even) {
        background-color: lightgray;
    }

    .table tr:hover {
        background-color: gainsboro;
    }

.App-header {
    background-color: black;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    font-size: calc(10px + 2vmin);
    color: white;
}

.App-link {
    color: lightblue;
}

POSTMAN Praktika

pakiautomaadid

namespace veeb.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ParcelMachineController : ControllerBase
    {
        private readonly HttpClient _httpClient;

        public ParcelMachineController(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        [HttpGet]
        public async Task<IActionResult> GetParcelMachines()
        {
            var response = await _httpClient.GetAsync("https://www.omniva.ee/locations.json");
            var responseBody = await response.Content.ReadAsStringAsync();
            return Content(responseBody, "application/json");
        }
    }
}

Nordpool

app.js

nordpool/ee

NordpoolController

Makse

Code

using Microsoft.AspNetCore.Mvc;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text;

namespace veeb.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class PaymentController : ControllerBase
    {
        private readonly HttpClient _httpClient;

        public PaymentController(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        [HttpGet("{sum}")]
        public async Task<IActionResult> MakePayment(string sum)
        {
            var paymentData = new
            {
                api_username = "e36eb40f5ec87fa2",
                account_name = "EUR3D1",
                amount = sum,
                order_reference = Math.Ceiling(new Random().NextDouble() * 999999),
                nonce = $"a9b7f7e7as{DateTime.Now}{new Random().NextDouble() * 999999}",
                timestamp = DateTime.Now,
                customer_url = "https://maksmine.web.app/makse"
            };

            var json = JsonSerializer.Serialize(paymentData);
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            var client = new HttpClient();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "ZTM2ZWI0MGY1ZWM4N2ZhMjo3YjkxYTNiOWUxYjc0NTI0YzJlOWZjMjgyZjhhYzhjZA==");

            var response = await client.PostAsync("https://igw-demo.every-pay.com/api/v4/payments/oneoff", content);

            if (response.IsSuccessStatusCode)
            {
                var responseContent = await response.Content.ReadAsStringAsync();
                var jsonDoc = JsonDocument.Parse(responseContent);
                var paymentLink = jsonDoc.RootElement.GetProperty("payment_link");
                return Ok(paymentLink);
            }
            else
            {
                return BadRequest("Payment failed.");
            }
        }
    }
}

PaymentController

KASUTAJA

GET kasutaja

muuda-nime kasutaja

Muuda-parooli kasutaja

Muuda-eesnime kasutaja

Muuda-perenime kasutaja