Dodawanie do bazy przy pomocy Web Api

0

Witam
Dostałem zadanie do zrobienia i nie wiem jak się za to zabrać. Muszę zrobić Web Api- to bez problemu. Ale musi być tak, że rekord dodaje się do bazy po wpisaniu w adresie przeglądarki i zatwierdzeniu enterem. Ma wysyłać się metodą post. Jak do tego podejść? Szukałem na różnych stronach i nie znalazłem. Dodam tylko, że ma się także dodawać np taki ciąg: " KA:12k/fd1\asA ". Jak to rozwiązać?

0

Ale jakie jest konkretnie pytanie?
Na początku wykorzystaj istniejący, defaultowy kontroler, zapoznaj się z atrybutami [HttpGet] i [HttpPost], z konwencjami dotyczącymi routingu, poczytaj o różnicach między [FromBody], a [FromUrl], odwołaj się z akcji do DbContextu i dodaj rekord.

0

konkretnie to muszę dodać do bazy ciąg: "#tg/34:54\HA" jako całość. Muszę to zrobić wpisując w adres przeglądarki: api/controller/tenCiag i nie wiem jak do tego podejść, na razie mi nie działa.

0

Doszedłem do pewnych wniosków. Web api mi działa. Dodaje do bazy to co chce, nie działa mi tylko gdy dodam np: sdd/sdfs/a Jak to można rozwiązać? Kombinuję w ten sposób:
[Route("api/productsAdd/{name}")]

ale mi nie działa

0

Próbowałem i niestety nie działa mi ta konfiguracją. Cały czas mam błędy. W którą stronę kombinować? Myślałem żeby zmieniać w web configu- nie działa. Na różne sposoby próbowałem. Są jakieś sposoby może na dodanie czegoś do WebApiConfigu lub RouteConfigu? Bo już nie mam pojęcia. Dwa dni od rana do wieczora siedzę i nie działa :(

0

Ale wiesz, że Twój problem wynika z tego, że próbujesz zrobić coś bez sensu, co jest jakby niezgodne z HTTP i w ogóle tak się nie robi?

0

Wiem, że mój problem jest niezgodny ale muszę to zrobić na zajęcia. Wykładowca tak sobie wymyślił żebym się pomęczył a potem mam mu odpowiedzieć czy to jest dobre rozwiązanie i dlaczego tak uważam. Nie mój wymysł ;\ W kodzie mam zwykły kontroler i modyfikację w web.config

<system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" 
                 requestPathInvalidCharacters="" /> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->   
    <pages validateRequest="false" /> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules> 
  </system.web>
 <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
    
    <modules runAllManagedModulesForAllRequests="true"> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->
      
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules >
  </system.webServer>

Kod kontrolera api- część odpowiedzialna za dodawanie:


public class ProductsController : ApiController
    {
        private ApiContext db = new ApiContext();


        [Route("api/productsAdd/{*name}")]
        [ResponseType(typeof(Products))]
        [AcceptVerbs("GET", "POST")]
        [HttpPost]
        public bool Add(string name)
        {
            Products products = new Products();
            products.Text = name;
            products.Date=DateTime.Now;
            products.Name = "text";
            products.LastName = "fsgs";

            db.Products.Add(products);
            db.SaveChanges();
            return true;
        }

        //    #TG/29:78\HC



        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool ProductsExists(int id)
        {
            return db.Products.Count(e => e.Id == id) > 0;
        }
    }

Zamieściłem wyżej mój kod api i configu. Jak mogę podejść do problemu? Dodam tylko że ta konfiguracja api działa w ten sposób że dodaje do bazy np: ka:/fd/aa ale nie zamienia dodając backslash na slash oraz pomija wszystko co jest za znakiem #, np #asd doda do bazy null a fds#aas doda do bazy fds

2

Pomija wszystko co jest za znakiem #, np #asd doda do bazy null a fds#aas doda do bazy fds

No to już masz jakąś poszlakę w kwestii "czy to dobry pomysł" żeby przekazywać tego typu dane GETem.

Tutaj masz definicję URLa: https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax

W ogóle. Wejdź pod ten adres który dałem. Zauważ, że od razu przewinęło Ci stronę do właściwego momentu, który Ci chciałem pokazać (tzn. na górze ekranu powinieneś mieć nagłówek "Syntax"). Teraz skasuj #Syntax z paska adresu i wejdź jeszcze raz. Tym razem strona załadowała się normalnie, a nie przewinięta w dół do sekcji "Syntax".

Jeżeli dopiszesz #costam do adresu to przeglądarka interpretuje to w specjalny sposób (w uproszczeniu: "skocz do sekcji na stronie"), właśnie po to, żeby dało się podlinkować jakiś podpunkt w długim artykule etc. Te dane po znaku # nie są w ogóle wysyłane na serwer, toteż nie odbierzesz ich po stronie C#, bo ich tam po prostu nie ma.

No to teraz tak. Jak to obejść? Co jeżeli chcemy serio wysłać coś ze znakiem # i nie chcemy żeby przeglądarka to interpretowała w specjalny sposób?

https://en.wikipedia.org/wiki/Percent-encoding

When a character from the reserved set (a "reserved character") has special meaning (a "reserved purpose") in a certain context, and a URI scheme says that it is necessary to use that character for some other purpose, then the character must be percent-encoded.

potwierdza to moje powyższe słowa na temat znaku #;

na tej stronie możemy wyczytać w jaki sposób escape-ować/enkodować/wtf specjalne znaki między innymi dla URLi. I tutaj podpowiem: zamiast # daj %23 w adresie. Przeglądarka będzie wiedziała że ma tego nie ruszać, a serwer powinien dostać już odkodowany, normalny znak #.

O ile dobrze pamiętam dzięki temu percent-encodingowi można przemycić dowolny znak w URLu, który normalnie by nie przeszedł. Wnioski wyciągnij sam.

PS. No i jeszcze musisz coś zrobić w configu IISa jeżeli nie będzie Ci pozwalał tych znaków specjalnych wrzucić w URLa (tzn. zwróci Bad Request czy coś).

0

Dzięki za podpowiedź. Jak kod zakoduję i podam w przeglądarce to działa. A czy jest możliwość by za każdym razem kodować przesyłany tekst? C# sobie go odkoduje i doda do bazy czy nie ma takiej możliwości?

0

Generalnie siedząc dziś od rana nic nie wymyśliłem. Szukam rozwiązania w web.configu. W dobrym miejscu szukam problemu? generalnie muszę jeszcze tylko zrobić że jak wpiszę w adresie np: zasada%@# to przekonwertuje mi i wyśle do kontrolera ciąg: zasada%25%40%23 a ten już go obrobi i doda do bazy. Jak wpiszę samo: zasada%25%40%23 to działa-> dodaje do bazy a cały czas mam problem gdy wpisuję: zasada%@#. Albo jest null albo błędy albo dodaje częściowo. W internecie nic nie jest opisane. Poszę o pomoc. Chociaż o nakierunkowanie w którą stronę iść bo nie wiem ;\

1 użytkowników online, w tym zalogowanych: 0, gości: 1