# C# in the Nutshell - HTTP
## Sposoby dodawania zmiennych w requestach HTTP
### `[FromRoute]`
Informacja, że parametr metody jest brany z url.
```csharp=
[HttpGet("{id}")]
public ActionResult<Character> GetById([FromRoute] int id)
{
return _characterService.GetById(id);
}
```
### `[FromQuery]`
```csharp=
public ActionResult<List<Character>> Get([FromQuery] bool? isAlive)
{
var character = _characterService.GetAll(isAlive);
if (character == null)
{
return new NotFoundObjectResult("404 not found :C");
}
else
{
return new OkObjectResult(character);
}
}
```
### `[FromBody]`
```csharp=
[HttpPost]
public ActionResult<Character> AddCharacter(
[FromBody] CharacterWebModel character)
{
return _characterService.AddCharacter(character);
}
```
## Więcej HTTP
### POST
Używamy posta, żeby dodawać rzeczy do bazy danych (taki `INSERT` z baz danych)
```csharp=
[HttpPost]
public ActionResult<Character> AddCharacter(
[FromBody] CharacterWebModel character)
{
return _characterService.AddCharacter(character);
}
```
### PUT
Używamy puta, żeby edytować istenijące elementy bazy danych (`UPDATE`)
```csharp=
[HttpPut("{id}")]
public ActionResult<Character> DealDamageToCharacter(
[FromRoute] int id,
[FromBody] HpToTakeFromCharacterWebModel webModel)
{
return _characterService.DealDamageToCharacter(id, webModel);
}
```
### DELETE
Używamy delete, żeby usunąć element z bazy danych. (`DELETE`)
```csharp=
[HttpDelete("{id}")]
public ActionResult<Character> DeleteCharacter([FromRoute] int id)
{
return _characterService.DeleteCharacter(id);
}
```
## Opcjonalna zmienna
Jeśli przy deklaracji parametru funkcji podamy `?`, to znaczy że dana zmienna nie jest wymagana do wywołania metody.
```csharp=
public ActionResult<List<Character>> GetAll(bool? isAlive)
{
return isAlive == null
? _dataContext.Characters.ToList()
: _dataContext.Characters
.Where(x => x.IsAlive == isAlive)
.ToList();
}
```
Czyli funkcję `GetAll` możemy wywołać na poniższe sposoby:
```csharp=
var characters = _characterService.GetAll();
// zwróci wszystkie obiekty z listy
// _dataContext.Characters
var characters = _characterService.GetAll(true);
// zwróci wszystkie obiekty z listy _dataContext.Characters,
// które mają property isAlive=true
```
> Warunek zapisany w return funkcji `GetAll` zapisać też jako
> ```csharp=
> if(isAlive == null)
> {
> return _dataContext.Characters.ToList();
> }
> else
> {
> return _dataContext.Characters
> .Where(x => x.IsAlive == isAlive)
> .ToList();
> }
> ```
## LINQ
### Wybierz największy id z listy
```csharp=
var id = _dataContext.Characters
.Select(x => x.Id)
.Max();
```
## Inne elementy C#
### Własny komuinikat przy 404:
```csharp=
return new NotFoundObjectResult("Character not found :(");
```
### Singleton
Jest to taki element kodu, który pozostaje niezmienny dla różnych jego wywołań. Ta niezmienność nie polega jednak na zachowaniu dokładnie tej samej wartości przez cały czas, a na zachowywaniu swoich właściwości dla wszystkich wywołań, czyli jeśli np. jest to pole w klasie, to wszystkie obiekty tej klasy będą mieć *ten sam* singleton Zmiana w dowolnym z nich zmieni go także dla wszystkich pozostałych.
```csharp=
public static DataContext _dataContext;
```
> W naszym przykładzie zastępuje on tymczasowo bazę danych. Możemy wykonywać wszystkie operacje tak jak na prawdziwej bazie danych, ale po zresetowaniu aplikacji przywrócona będzie wersja początkowa.
###### tags: `.Net PG` `C#`