在一种方法中使用“尝试并捕获”来验证HttpWebRequest

时间:2018-09-03 05:28:42

标签: c# methods return httpwebrequest

我正在学习C#,通过此类我可以从API中获取JSON信息,然后从表单中调用我的类“ MyClass”以将值放入相应的字段中,但是我不知道如何检测是否与API的连接未成功,我知道必须使用try and 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 :(得分:0)

不要这样做:

threshold.setText(String.valueOf(thresholdValue));

这将简单地“吞噬”任何运行时错误。如果连接失败,catch (Exception) { return null; } 将为您提供NullpointerException,该异常不会告诉您确切的错误。相反,请查看“ MyMethod”中可能出现的问题以及将导致的特定异常。仅捕获您知道如何处理的异常。如果您还不知道如何处理特定的异常,请不要捕获它。这将导致您的程序崩溃,并显示一些有意义的错误消息。从那里开始工作。尝试尝试所有可能使连接失败的方法,并观察抛出了哪些异常,因此您可能想出了一种方法来防止这些情况或从中恢复。

答案 1 :(得分:0)

您的疑问是对的。这不是处理您的异常的正确方法。

您应该使用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

答案 2 :(得分:0)

您不应仅为方法创建类。您可以将此方法放在UI事件处理程序的旁边(如果仅在此处使用)。或为所有API调用创建静态帮助程序类-如果在调用之间重用Cookie之类的内容,则不是静态的。但是然后为整个UI或最多为表单创建一个实例。

请注意,API调用在技术上可能会成功,并且您仍然会收到错误消息。尝试反序列化之前,请检查StatusCode property。如果出现网络或http级问题,您很可能会收到IOExceptionWebException。如果服务器代码有故障或您传递了无效的参数,您将获得一个不同于200(确定)的状态代码-还有其他成功状态代码。但是您还可以获得内容解析异常。始终记录此类异常,即使是临时记录,也不要仅仅注意到它就处理!

但是我建议您使用HttpClient class代替HttpContentExtensions methods。有许多优点,因为它针对API调用进行了优化,并且支持所有操作的异步操作。后来的软件包使在使用任何方法读取或发送时轻松处理自定义对象。请注意,HttpClient实例是optimized,即使在线程之间也具有可重用性-因此,您的应用程序中只能有一个或几个。不幸的是,在该主题中我没有找到任何完整的教程可以链接到。