C# 无法查看 API 上的错误 响应只是向 Try/Catch 抛出异常
C# Unable to view Errors on API Response just throws an Exception to Try/Catch
我正在编写一个程序来检查凭证号码是否有效,但我发现很难从我正在使用的 REST API 中提取错误消息。
通常,C# 对我来说还是很新的 VB.net 但现在可以帮到别人了。
基本上我有一个 HttpWebReqest
和 HttpWebResponse
对象,使用下面的代码我成功地发出了请求并得到了很好的响应。
当一切顺利时,没有问题,但是例如,如果凭证无效或网站无效,我应该会收到这样的回复,就像我在 Postman 中所做的那样,请参见下面的示例。
{
"message": "The given data was invalid.",
"errors": {
"voucher_no": [
"Sorry, that voucher number is invalid."
]
}
}
相反,我被扔到 Try/Catch.. 异常
Error Message Error 422 unprocessable entity,
没有进一步的细节或对象来检查上面的真实消息?
try
{
using (HttpWebResponse response = mywebrequest.GetResponse() as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
{
// I am unable to get to this part of the Code to process the Error because Try/Catch is executed instead ...
}
else
{
Stream dataStream1 = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream1);
responseFromServer = reader.ReadToEnd();
}
}
}
catch (WebException ex)
{
msgbox = new MsgBox_UI("Error", "Web Server Returned an Error", "There is a problem with this Voucher. It may be Expired or invalid at this time.", 1, false, 28);
msgbox.ShowDialog();
break;
}
如果有人对我如何使这个工作有任何想法,那将是一个很大的帮助。
这是设计使然,当请求 returns 一个 ' 不成功[=22= 时,GetResponse
将抛出一个 WebException
(1) ]'状态码。
- 您可以查看
WebException
上的 Status
属性 以获取状态代码
- 和
Response
属性 用于网络服务器的响应。
首先最好使用 HttpClient class。
这段代码应该适合你(如果不让我知道):
private async Task<string> GetExtensionToken()
{
string url = "https://YourApi.com";
try
{
var httpclient = new HttpClient();
using (HttpResponseMessage response = httpclient.GetAsync(url).Result)
{
using (HttpContent content = response.Content)
{
string result = content.ReadAsStringAsync().Result;
string Is_Not_Valid = "invalid";
if (result.Contains(Is_Not_Valid))
{
string token = "Whatever you want to extract if error page" ;
return token;
}
else
{
string token = "Whatever you want to extract if succeeded" ; return token;
}
}
}
}
catch (Exception ex)
{
return "Error from catch ";
}
}
用法:
private async void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = await GetExtensionToken();
}
好的,所以我采纳了上面 Peter 的建议并决定使用 HttpClient()。
但是我实际上使用了 Restharp 并将 Nuget 包 RestSharp 安装到我的项目中。 (主要原因是 POSTMAN Code Snippet 给了我确切的使用代码。
然后一切如梦如幻。
我不是异步的,所以这是我在添加
后发现的解决问题的方法
using RestSharp;
var client = new RestClient("https://api.voucherURL.uk/redeem");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Smart-Auth", "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxx");
request.AddHeader("Accept", "application/json");
request.AddParameter("application/json", "{\n \"voucher_no\":\"JY584111E3\",\n \"site_id\": 14\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
我正在编写一个程序来检查凭证号码是否有效,但我发现很难从我正在使用的 REST API 中提取错误消息。 通常,C# 对我来说还是很新的 VB.net 但现在可以帮到别人了。
基本上我有一个 HttpWebReqest
和 HttpWebResponse
对象,使用下面的代码我成功地发出了请求并得到了很好的响应。
当一切顺利时,没有问题,但是例如,如果凭证无效或网站无效,我应该会收到这样的回复,就像我在 Postman 中所做的那样,请参见下面的示例。
{
"message": "The given data was invalid.",
"errors": {
"voucher_no": [
"Sorry, that voucher number is invalid."
]
}
}
相反,我被扔到 Try/Catch.. 异常
Error Message Error 422 unprocessable entity,
没有进一步的细节或对象来检查上面的真实消息?
try
{
using (HttpWebResponse response = mywebrequest.GetResponse() as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
{
// I am unable to get to this part of the Code to process the Error because Try/Catch is executed instead ...
}
else
{
Stream dataStream1 = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream1);
responseFromServer = reader.ReadToEnd();
}
}
}
catch (WebException ex)
{
msgbox = new MsgBox_UI("Error", "Web Server Returned an Error", "There is a problem with this Voucher. It may be Expired or invalid at this time.", 1, false, 28);
msgbox.ShowDialog();
break;
}
如果有人对我如何使这个工作有任何想法,那将是一个很大的帮助。
这是设计使然,当请求 returns 一个 ' 不成功[=22= 时,GetResponse
将抛出一个 WebException
(1) ]'状态码。
- 您可以查看
WebException
上的Status
属性 以获取状态代码 - 和
Response
属性 用于网络服务器的响应。
首先最好使用 HttpClient class。
这段代码应该适合你(如果不让我知道):
private async Task<string> GetExtensionToken()
{
string url = "https://YourApi.com";
try
{
var httpclient = new HttpClient();
using (HttpResponseMessage response = httpclient.GetAsync(url).Result)
{
using (HttpContent content = response.Content)
{
string result = content.ReadAsStringAsync().Result;
string Is_Not_Valid = "invalid";
if (result.Contains(Is_Not_Valid))
{
string token = "Whatever you want to extract if error page" ;
return token;
}
else
{
string token = "Whatever you want to extract if succeeded" ; return token;
}
}
}
}
catch (Exception ex)
{
return "Error from catch ";
}
}
用法:
private async void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = await GetExtensionToken();
}
好的,所以我采纳了上面 Peter 的建议并决定使用 HttpClient()。
但是我实际上使用了 Restharp 并将 Nuget 包 RestSharp 安装到我的项目中。 (主要原因是 POSTMAN Code Snippet 给了我确切的使用代码。
然后一切如梦如幻。
我不是异步的,所以这是我在添加
后发现的解决问题的方法using RestSharp;
var client = new RestClient("https://api.voucherURL.uk/redeem");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Smart-Auth", "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxx");
request.AddHeader("Accept", "application/json");
request.AddParameter("application/json", "{\n \"voucher_no\":\"JY584111E3\",\n \"site_id\": 14\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);