首页 > 解决方案 > 如何检查我的 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();
                    }
                }
            }
        }
    }

标签: c#jsonjsonconvert

解决方案


所以基本上你的主要问题在于你的

GetOpenZTOrders()函数,它应该返回 HTTP 状态代码,然后您可以简单地检查或为不同类型的状态代码制作切换案例。

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 方案,如果不正确,您将处理错误。


推荐阅读