c# - 如何检查我的 json 字符串是否存在 502 错误
问题描述
我有一个 API 调用,它返回一个 json 格式的查询字符串。有时我会收到以下回复
"<html>\r\n<head><title>502 Bad Gateway</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>502 Bad Gateway</h1></center>\r\n</body>\r\n</html>\r\n"
我解释这个响应的代码是
string jsonOrdersString = bitmexApi.GetOpenZTOrders(25);//
List<OrderRecord> newList = JsonConvert.DeserializeObject<List<OrderRecord>>(jsonOrdersString);
这在大多数情况下都有效,直到我收到错误 502 错误。如何检查我的 json 字符串以查看是否有错误并处理它?还值得注意的是,我在这个程序中有很多反序列化进程,所以保持这个错误处理的效率会很好。
感谢任何帮助,我是 c# 和 json 的新手,这个问题阻碍了这个项目。
谢谢!
编辑:GetOpenZTOrderS() 函数调用此 Query 函数。我怎样才能修改它以获得也返回状态码?
private string Query(string method, string function, Dictionary<string, string> param = null, bool auth = false, bool json = false)
{
string paramData = json ? BuildJSON(param) : BuildQueryData(param);
string url = "/api/v1" + function + ((method == "GET" && paramData != "") ? "?" + paramData : "");
string postData = (method != "GET") ? paramData : "";
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(domain + url);
webRequest.Method = method;
if (auth)
{
string expires = GetExpires().ToString();
string message = method + url + expires + postData;
byte[] signatureBytes = hmacsha256(Encoding.UTF8.GetBytes(apiSecret), Encoding.UTF8.GetBytes(message));
string signatureString = ByteArrayToString(signatureBytes);
webRequest.Headers.Add("api-expires", expires);
webRequest.Headers.Add("api-key", apiKey);
webRequest.Headers.Add("api-signature", signatureString);
}
try
{
if (postData != "")
{
webRequest.ContentType = json ? "application/json" : "application/x-www-form-urlencoded";
var data = Encoding.UTF8.GetBytes(postData);
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
using (WebResponse webResponse = webRequest.GetResponse())
using (Stream str = webResponse.GetResponseStream())
using (StreamReader sr = new StreamReader(str))
{
return sr.ReadToEnd();
}
}
catch (WebException wex)
{
using (HttpWebResponse response = (HttpWebResponse)wex.Response)
{
if (response == null)
throw;
using (Stream str = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(str))
{
return sr.ReadToEnd();
}
}
}
}
}
解决方案
所以基本上你的主要问题在于你的
GetOpenZTOrders()函数,它应该返回 HTTP 状态代码,然后您可以简单地检查或为不同类型的状态代码制作切换案例。
但是,如果您不访问该函数并且只需要对不良设计做出假设,则可以编写字符串扩展名,这将验证正确的 JSON。
public static bool IsValidJson(this string stringValue)
{
if (string.IsNullOrWhiteSpace(stringValue))
{
return false;
}
var value = stringValue.Trim();
if ((value.StartsWith("{") && value.EndsWith("}")) || //For object
(value.StartsWith("[") && value.EndsWith("]"))) //For array
{
try
{
var obj = JToken.Parse(value);
return true;
}
catch (JsonReaderException)
{
return false;
}
}
return false;
}
所以主要是验证 JSON 方案,如果不正确,您将处理错误。
推荐阅读
- angular - 在单个 Ionic + Angular 项目中的两个 ionic 应用程序之间导航
- python - 在 Dataframe 上将 STR 转换为 INT 不适用于特定部分
- c++ - 与 std::function<> 相关的问题。这是如何工作的?
- encryption - “Scripting.Encoder”.EncodeScriptFile() 替代品?
- google-cloud-platform - 具有跨项目 Cloud Run 服务的 GCP 负载平衡器
- angular - 角度测试 - NullInjectorError: StaticInjectorError(DynamicTestModule)[NgxPermissionsDirective -> NgxPermissionsService]
- ruby-on-rails - Ruby on Rails:单表继承和 has_and_belongs_to_many 关系的问题
- vue.js - 与 vuex 的 Websocket 连接
- java - 图标是否缓冲?
- python - 在 python 中使用 pandas 打印 CSV 文件时出现问题