Как я могу проверить мою строку json на 502 ошибки - PullRequest
0 голосов
/ 01 марта 2020

У меня есть вызов 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 error. Как я могу выполнить проверку моей строки json, чтобы увидеть, есть ли ошибка, и обработать ее? Также стоит отметить, что в этой программе есть много процессов десериализации, поэтому было бы неплохо сохранить эффективность обработки ошибок.

Любая помощь приветствуется, я новичок в c# и json, и это проблема задерживает этот проект.

Спасибо!

Редактировать: функция GetOpenZTOrderS () вызывает эту функцию запроса. Как я могу изменить это, чтобы получить также вернуть код состояния?

 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();
                    }
                }
            }
        }
    }

1 Ответ

0 голосов
/ 01 марта 2020

Таким образом, в основном ваша основная проблема заключается в вашей функции

GetOpenZTOrders () , она должна возвращать код состояния HTTP, а затем вы можете просто проверить или выполнить переключение для другого типа коды состояния.

Http Status Codes

Но если у вас нет доступа к этой функции и вам просто нужно сделать предположение о плохом дизайне, вы можете просто написать строку расширение, которое подтвердит правильность 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, если она не верна, вы исправите ошибку.

...