WebRequest obsługa opisu odpowiedzi

0

Chciałbym wiedzieć jak poprawnie obsłużyć GetResponse. Za każdym razem gdy kod nie przechodzi łapie mi wskazanej linii, error 400 bad request ale nie mam więcej informacji ani nie widzę co jest w description tego błędu co utrudnia zabawę.

        public string runAutorisationChallenge()
        {

            WebRequest webReq = WebRequest.Create("https://some.random.pl/api/online/sayhi");
            webReq.Method = "POST";
            webReq.ContentType = "application/json";
            
            using (Stream requestStream = webReq.GetRequestStream())
            {
                using (StreamWriter streamWriter = new StreamWriter(requestStream))
                {
                    streamWriter.Write(sayhi());

                    streamWriter.Flush();

                    using (WebResponse webResponse = webReq.GetResponse())  // < ------
                    {
                        using (Stream responseStr = webResponse.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(responseStr))
                            {
                                string response = reader.ReadToEnd();
                                return response;
                            }
                        }
                    }
                }
            }
        }

1

A nie chcesz przerzucić się na httpclient? Webrequest jest staaaary

0

Owszem docelowo chciałbym przejść na httpClient, po prostu WebRequest do nauki był mi bardziej przystępny na początek :)

0

Możesz złapać wyjątek i dobrać się do responsa z wyjątku

catch (WebException e)
{
  var status = e.Status;
  var response = (HttpWebResponse)e.Response;
  var responseStr = webResponse.GetResponseStream();
}

HttpClient to tylko wrapper na WebRequest: https://github.com/microsoft/referencesource/blob/master/System/net/System/Net/Http/HttpClientHandler.cs
WebRequest nie jest "stary", po prostu w tej postaci jest trudniejszy w obsłudze. HttpClient upraszcza jego interfejs i zajmuje się kilkoma problemami, jak na przykład port exhaustion

3
obscurity napisał(a):

HttpClient to tylko wrapper na WebRequest: https://github.com/microsoft/referencesource/blob/master/System/net/System/Net/Http/HttpClientHandler.cs

W archeologię się bawisz, że zaglądasz do źródeł .NET Frameworka?
W przypadku .NET Core bardzo wątpię, że HttpClient to tylko nakładka na WebRequest. W źródłach .NET Core nie udało mi się niczego takiego znaleźć.

Raczej w drugą stronę, czyli WebRequest korzysta wewnętrznie z HttpClienta - https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Requests/src/System/Net/HttpWebRequest.cs

obscurity napisał(a):

WebRequest nie jest "stary", po prostu w tej postaci jest trudniejszy w obsłudze.

Jest stary i niezalecany do używania w przypadku pisania nowego kodu.
Nie znam żadnego powodu dla którego ktoś miałby używać WebRequesta zamiast HttpClienta.

0
        public string runAutorisationChallenge()
        {

            WebRequest webReq = WebRequest.Create("https://some.random.pl/api/online/sayhi");
            webReq.Method = "POST";
            webReq.ContentType = "application/json";
            
            using (Stream requestStream = webReq.GetRequestStream())
            {
                using (StreamWriter streamWriter = new StreamWriter(requestStream))
                {
                    streamWriter.Write(sayhi());

                    streamWriter.Flush();

                    try
                    {
                    using (WebResponse webResponse = webReq.GetResponse())  // < ------
                    {
                        using (Stream responseStr = webResponse.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(responseStr))
                            {
                                string response = reader.ReadToEnd();
                                return response;
                            }
                        }
                    }
                    }
                    catch (WebException e)
                {
                    var status = e.Status;
                    var response = (HttpWebResponse)e.Response;

                    var responseStr = WebResponse.GetResponseStream();

                    return "fail";
                }
                }
            }
        }

0

Co zwraca Tobie e.Message? Poza tym to co wkleiłeś nawet się nie skompiluje.

screenshot-20220802122901.png

teraz możesz wbijać na google i czytać co może być nie tak. Rozwiązanie znalazłem w minutę :)

screenshot-20220802123007.png

Jak już Ci uda się z tym uporać to dostaniesz kolejny błąd:
screenshot-20220802123721.png

0

responseStr Tobie to zwraca? Czy kompilator krzyczy Tobie o błędzie?
Spróbuj tak:

catch (WebException e)
{
  Debug.WriteLine(e.Message);
}
0

Kompilator mnie opierdziela :)

screenshot-20220802130526.png

Nie chodzi mi o coś takiego jak nizej. Jak dobrze rozumiem to jest sam błąd http, ja chce opis błędu z APi. Response powinno zwrócić mi jeszcze jsona takiego:
"exceptionDetailList": [
{
"exceptionCode": 12345,
"exceptionDescription": "Opis błędu."
}
screenshot-20220802132243.png

0

Najpierw musisz zadbać o to, aby Twoja odpowiedź była z kodem 200-300. następnie możesz dopiero parsować dane.

Jeżeli chodzi o samo zwracanie kodu statusu wróć do mojej pierwszej odpowiedzi i zastosuj ją :)
Jeżeli nadal upierasz się przy swoim to łap linki

  1. jak znalazłem to w google:
    https://www.google.com/search?q=how+to+get+http+code+webrequest&oq=how+to+get+http+code+webrequest&aqs=chrome..69i57j33i160l2.6694j0j7&sourceid=chrome&ie=UTF-8

  2. Przykład kodu
    https://docs.microsoft.com/pl-pl/dotnet/api/system.net.httpwebresponse.statuscode?view=net-6.0

  3. Kody statusów
    https://docs.microsoft.com/pl-pl/dotnet/api/system.net.httpstatuscode?view=net-6.0

0

Założenie spełnił poniższy kod.

catch (WebException e)
                    {
                        var status = e.Status;
                        var response = (HttpWebResponse)e.Response;
                        using (Stream responseStr = response.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(responseStr))
                            {
                                string jsonread = reader.ReadToEnd();
                                return jsonread;
                            }
                        }
                    }

0

To nie lepiej tak?:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync("http://www.contoso.com/");
if(response.IsSuccessStatusCode)
  return await response.Content.ReadAsStringAsync();

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