---
# System prepended metadata

title: C# in the Nutshell - API
tags: [API, C#, .Net PG]

---

# C# in the Nutshell - API

## Controller

Jest to klasa zawierająca metody, do których możemy się odwoływać korzystając z API, czyli wysyłając żądania HTTP na podane w nim adresy.

```csharp=
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
/* jakiś kod */
}
```

`[ApiController]` informuje, że podana klasa jest controllerem.
`[Route("api/[controller]"` informuje, że aby wysłać żądanie do tego controllera, trzeba je rozpocząć od `api/nazwaControllera` 
> `[controller]` domyślnie wyciąga swoją wartość z nazwy klasy, z pominięciem słowa `Controller`, więc w naszym przypadku route będzie wyglądać tak: `api/values`. Korzystanie z `[controller]` nie jest konieczne, można ręcznie wpisać pełną ścieżkę.


## HTTP

### GET 
Jest to żądanie konkretnej informacji od serwera.

```csharp=
// GET api/values/{id}
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
    return "value";
}
```

`[HttpGet]` wskazuje, żeby uruchomić tę metodę, gdy otrzymamy zapytanie do pasującego adresu, ze wskazeniem, że jest to żądanie typu GET. Jeśli nie ma podanych żadnych dodatkowych informacji, to do tej metody trafią wszystkie żądania GET wysłane na adres kontrolera.

`[HttpGet("{id}")]` wskazuje, że w adresie żądania przekazywana jest zmienna o nazwie id.

> Warto dodać, że poza parametrami w atrybucie mogą się też pojawiać inne elementy, pozwalające lepiej rozróżnić metody. 
> Ponadto można zdefiniować całą ścieżkę do danej metody, wtedy `[Route("api/[controller]")]` w atrybucie controllera nie będzie potrzebne.

### POST 
Jest to żądanie umieszczenia czegoś na serwerze.

```charp=
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
```
`[FromBody]` informuje, że value jest przekazywana jako ciało żądania HTTP. Będzie to poruszane na kolejnych zajęciach.

### PUT 
Jest to żądanie związane z modyfikacją danych.
### DELETE
Jest to żądanie usunięcia danych z serwera.


## LINQ
### SingleOrDefault

```csharp=
_dataContext.Characters.SingleOrDefault(c => c.Id == id);
```

Ta metoda wyszukuje elementy kolekcji spełniające podany warunek.
* Jeśli nie znajdzie żadnego pasującego elementu, zwraca `null`
* Jeśli znajdzie 1 taki element, zwraca go.
* Jeśli znajdzie więcej niż 1 pasujący element, rzuca wyjątkiem

###### tags: `.Net PG` `C#` `API`