Я пытаюсь выяснить, какая часть моего приложения (Xamarin Forms и прокси, написанные на PHP) содержит ошибки. Сначала я подумал, что мой прокси (написанный на PHP) некорректно работает с длинным набором данных (т. Е. Json, содержащим 1.300.000 символов) и возвращает некорректный ответ, но каждый запрос Postman дает мне правильный JSON, который успешно декодируется с помощью сторонние инструменты. Поэтому я предполагаю, что прокси работает хорошо.
Проблема заключается (я думаю) в расшифровке ответа в моем приложении Xamarin Forms (2.0.0-beta.22). Я использую HttpClient
, чтобы прочитать ответ с этим кодом:
response.EnsureSuccessStatusCode();
var entries = new List<HistoryEntry>();
var content = await response.Content.ReadAsStringAsync();
_loggerService.Error(content);
response
- это просто GetAsync
ответ от HttpClient
. Проблема в том, что content
случайно неполно / неправильно сформирован. Сказав это, я имею в виду, что последний символ отсутствует (}
), или ключи / значения JSON имеют дополнительный символ "
, который нарушает все. К сожалению, я могу делать одни и те же запросы много раз, и однажды это сработает, однажды нет. Я обнаружил, что это происходит только с большим набором данных (как я упоминал ранее, длинная строка JSON).
Есть ли вероятность, что ReadAsStringAsync
не ожидает полного ответа или каким-либо образом изменяет мою строку ответа? Как я могу найти причину неправильно загруженных данных?
РЕДАКТИРОВАТЬ 21.05.2019:
Просто скопировал действительный JSON (доступен здесь: https://github.com/jabools/xamarin/blob/master/json.txt) и вернул его из приложения Lumen на response()->json(json_decode(..., true))
и все тот же результат. Надеюсь, кто-то сможет воспроизвести это и помочь мне с этой проблемой :( Подробнее информация в комментариях.
Использовал этот код в C #:
Device.BeginInvokeOnMainThread(async () =>
{
for (int i = 0; i < 10; i++)
{
var response = await client.GetAsync("<URL_TO_PHP>");
//var response = await client.GetAsync("https://jsonplaceholder.typicode.com/photos");
var content = await response.Content.ReadAsAsync<object>();
Debug.WriteLine("Deserialized: " + i);
}
});