Jak wysłać GET-a

0

Witam, napisałem metodę wysyłającą link zawierający xml, Postem, ale teraz potrzebuje zrobić to samo GET-em i uzyskać odpowiedź. Podpowiecie mi jak to zrobić ? Mi niestety nerwy szaleją...

Tak wygląda to w POST :

 private string PlaceOrder (CreateOrderDto createOrderDto)
        {
            try {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(createOrderDto.OrderLink);
                request.ContentType = "text/xml; encoding='utf-8'";
                request.Method = "POST";
                Stream requestStream = request.GetRequestStream();
                requestStream.Close();
                HttpWebResponse response;
                response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    string responseStr = new StreamReader(responseStream).ReadToEnd();
                    return responseStr;
                }

            }
            catch (Exception e)
            {
                ModelState.AddModelError("", "Nieoczekiwany błąd serwisu.");
            }
            return null;
        }
1

GET nie służy do takich rzeczy. Co prawda maksymalna długość url'a nie jest wyspecyfikowana w RFC (zobacz dyskusję na http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers), ale w praktyce to okolice 2kB. Co prawda mowa o przeglądarkach a nie serwerach, ale powinieneś mieć świadomość, że do przesyłania dużych ilości danych służy POST. Przy czym duża ilość danych to w praktyce więcej niż kilkadziesiąt bajtów.
Jeśli bardzo się uprzesz, to System.Uri.EscapeDataString, ewentualnie System.Uri.EscapeUriString albo HttpUtility.UrlEncode. Ale powtarzam, GET nie jest od tego.

0

Zdaje sobie z tego sprawę aleurl jest krótki i zawiera tylko parę tagów. Musi być GET bo tego wymaga logika procesu w Javie. tylko nie mam pojęcia jak wysłać linka przez GET i otrzymać odpowiedź.

gdy zmieniam :

 request.Method = "POST";

dostaje exceptiona : {"Nie można wysłać elementu content-body z tym elementem verb-type."}

0

BTW "napisałem metodę wysyłającą link zawierający xml" - gdzie ta metoda? Napisałeś metodę robiącą request pod wskazany adres, w której niepotrzebnie otwierasz i zamykasz RequestStream i w której nieprawidłowo obsługujesz wyjątek, zdaje się już Ci w innym wątku pisałem o obsłudze wyjątków.
Jeśli po stronie serwera ktoś nie przewidział, że chcesz stukać i przez POST, i przez GET, to nic Ci z tego nie wyjdzie, nawet gdybyś tak bardzo bardzo chciał.

0
Altaro napisał(a):

gdy zmieniam :

 request.Method = "POST";

dostaje exceptiona : {"Nie można wysłać elementu content-body z tym elementem verb-type."}

A może gadasz z webserwisem? To wygeneruj klienta i znajdź dokumentację do API tego webserwisu, będzie znacznie łatwiej.

0

Inaczej. do CreateOrderDto wrzucam Stringa który jest linkiem. Jest on generowany z procedury sql w której sklecam tego całego Stringa i jest on poprawny bo gdy go skopiuje z debuga i odpale w przeglądarce to wszystko jest okej. chce tylko go odpalić w kontrolerze żeby dostać odpowiedź ( w odpowiedzi przychodzi krótki xml z numerem zamówienia który potem parsuje ). Ze streamem racja ( pozostałość po wcześniejszych próbach). wyjątek dałem tylko na potrzeby debugowania. Tak gadam do web serwisu.

0

Tak gadam do web serwisu

Wygeneruj klienta i gadaj za jego pośrednictwem z WS, a nie wyważasz szeroko otwarte drzwi.
Solution explorer -> prawy klik na References w nowym projekcie, w którym będziesz trzymać klientów -> Add service reference -> w pole address wklep url do WS z ?wsdl na końcu (bez żadnych innych parametrów), potem jeśli Twoja referencja nazywa się TwójWebserviceServiceReference. to w Twoim kodzie new TwójWebserviceServiceClient().PożądanaMetoda(parametry) i już.

0

GET zrobiłem to w ten sposób i działa.

 using (WebClient webClient = new WebClient())
                {
                    string responseBody = webClient.DownloadString(createOrderDto.OrderLink);
                    return responseBody;
                }

Ale potrzeba jest również wysłania tego POST - em i tutaj moje zapytanie.

To co podałem w pierwszym poście powinno się nadawać. W orderLink mamy w tym przypadku sam link do WS i teraz pytanie jak dodać body do requesta ? Body mam w stringu jako xml. Poniżej mój kod. :

 private string PlaceOrder (CreateOrderDto createOrderDto)
        {
            try {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(createOrderDto.OrderLink);
                request.ContentType = "text/xml; encoding='utf-8'";
                request.Method = "POST";
                Stream requestStream = request.GetRequestStream();
                requestStream.Close();
                HttpWebResponse response;
                response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    string responseStr = new StreamReader(responseStream).ReadToEnd();
                    return responseStr;
                }
 
            }
            catch (Exception e)
            {
                ModelState.AddModelError("", "Nieoczekiwany błąd serwisu.");
            }
            return null;
        }
0

btw. jak powinienem obsłużyć request.GetrequestStream ?

0

Nie odkrywaj koła na nowo. Wygeneruj klienta SOAP, podałem Ci jak to zrobić.

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