我正在学习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;
}
}
答案 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级问题,您很可能会收到IOException
或WebException
。如果服务器代码有故障或您传递了无效的参数,您将获得一个不同于200(确定)的状态代码-还有其他成功状态代码。但是您还可以获得内容解析异常。始终记录此类异常,即使是临时记录,也不要仅仅注意到它就处理!
但是我建议您使用HttpClient
class代替HttpContentExtensions
methods。有许多优点,因为它针对API调用进行了优化,并且支持所有操作的异步操作。后来的软件包使在使用任何方法读取或发送时轻松处理自定义对象。请注意,HttpClient
实例是optimized,即使在线程之间也具有可重用性-因此,您的应用程序中只能有一个或几个。不幸的是,在该主题中我没有找到任何完整的教程可以链接到。