---
# System prepended metadata

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

---

# 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#` 