Используйте Try and Catch в методе для проверки HttpWebRequest - PullRequest
0 голосов
/ 03 сентября 2018

Я изучаю C #, с этим классом я получаю информацию в JSON из API, затем из формы я называю свой класс "MyClass", чтобы поместить значения в соответствующие поля, но я не знаю, как определить, соединение с API было неудачным, я знаю, что необходимо использовать try и catch, и поэтому я помещаю его в свой класс «MyClass», но я не знаю, как правильно выполнить проверку:

У меня есть эти определенные классы:

public class Lawyer
{
    public string type { get; set; }
    public string numdoc { get; set; }
    public string name { get; set; }
    public string date { get; set; }
}

public class Worker
{
    public string time { get; set; }
    public string service { get; set; }
}

public class Result
{
    public string id { get; set; }
    public string name { get; set; }
    public string Condition { get; set; }
    public string PLE { get; set; }
    public List<Lawyer> lawyers { get; set; }
    public List<Worker> workers { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public Result result { get; set; }
}

И это мой "MyClass" (я пытался использовать "try" и "catch", но я не знаю, является ли это правильным способом ...):

class MyClass 
{
    public RootObject MyMethod(int inRUC){
  try {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.example.com/api/?get=" + inRUC);
        HttpWebResponse response;

        response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream);
        {
            var json = reader.ReadToEnd();
            return JsonConvert.DeserializeObject<RootObject>(json);
        }
      }
  catch (Exception)
        {
         return null;
        }
    }
}

Это раздел моей формы, который вызывает класс, он работает нормально, но я не знаю, как отсюда проверить, что соединение с API было успешным:

private void Button1_ClickBefore(object sboObject, SAPbouiCOM.SBOItemEventArg pVal, out bool BubbleEvent)
{
    if (string.IsNullOrEmpty(txtRuc1.Value.ToString()))
    {
        BubbleEvent = false;
    }
    else
    {
        BubbleEvent = true;

        int para = 0;
        int.TryParse(txtRuc1.Value, out para);

        MyClass obj = new MyClass();
        EditText1.Value = obj.MyMethod(para).result.name;
    }

}

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Ваше сомнение верно. Это не правильный способ обработки исключений в вашем случае.

Вам следует использовать WebException, что даст вам возможность прочитать ответ, отправленный сервером. Здесь вы можете проверить детали ошибочного ответа, полученного от API, и предпринять соответствующие действия. Ниже приведен пример кода для вашей справки. Вы можете настроить его под свои нужды.

        catch (WebException e)
        {
            using (WebResponse response = e.Response)
            {
                HttpWebResponse httpResponse = (HttpWebResponse)response;
                Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                using (Stream data = response.GetResponseStream())
                {
                    string text = new StreamReader(data).ReadToEnd();
                    Console.WriteLine(text);
                }
            }
        }

Подробнее о WbeException можно узнать здесь: https://docs.microsoft.com/en-us/dotnet/api/system.net.webexception?view=netframework-4.7.2

И еще некоторые подробности с примером кода здесь: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/handling-errors

0 голосов
/ 03 сентября 2018

Вы не должны создавать класс только для метода. Вы можете отложить этот метод в сторону вашего обработчика событий пользовательского интерфейса - если он используется только там. Или создайте статический вспомогательный класс для всех ваших вызовов API - или не статический, если вы повторно используете что-то между вызовами, например файлы cookie. Но затем создайте экземпляр для всего пользовательского интерфейса или самое большее для формы.

Обратите внимание, что вызов API может быть выполнен технически успешно, и вы все равно получите сообщение об ошибке. Проверьте StatusCode свойство перед попыткой десериализации. Скорее всего, вы получите IOException или WebException, если есть проблемы с сетью или уровнем http. Если код сервера неисправен или вы передали недопустимые параметры, вы получите код состояния, отличный от 200 (ОК) - есть и другие коды успеха. Но вы можете также получить исключения для анализа содержимого. Всегда регистрируйте такие исключения, даже временно, но никогда не обращайте внимания, просто заметив это!

Но я предлагаю вам использовать HttpClient class вместо HttpContentExtensions методов . Есть много преимуществ, так как это оптимизировано для вызовов API и поддерживает асинхронность для всех операций. Более поздний пакет позволяет легко обрабатывать пользовательские объекты при чтении или отправке любым методом. Осторожно, HttpClient экземпляры оптимизированы для возможности повторного использования даже между потоками - таким образом, вы можете иметь только один или несколько приложений. К сожалению, я не нашел ни одного полного руководства в этой теме для ссылки.

0 голосов
/ 03 сентября 2018

Не делайте этого:

catch (Exception)
{
    return null;
}

Это просто "проглотит" любые ошибки во время выполнения. В случае сбоя соединения obj.MyMethod(para).result.name; выдаст исключение NullpointerException, которое не сообщит вам, что именно пошло не так. Вместо этого взгляните на то, что могло бы пойти не так в «MyMethod» и какие конкретные исключения это может вызвать. Поймать только те исключения, которые вы знаете, как обрабатывать. Если вы (пока) не знаете, как обрабатывать конкретное исключение, не отлавливайте его. Это приведет к сбою вашей программы с довольно значимым сообщением об ошибке. Пройдите свой путь оттуда. Попробуйте все, что вы можете придумать, чтобы разорвать соединение, и посмотрите, какие исключения генерируются, чтобы вы могли найти способ предотвратить эти ситуации или исправить их.

...