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