【发布时间】:2019-07-30 09:18:08
【问题描述】:
我创建了一个简单的服务器应用程序,它将一个 json 数组发送到客户端。
在我的 xamarin 应用程序中,我每 500 毫秒得到一次。但有时(这些事件完全随机)json 中缺少单个字符(数组的结尾 ])。所以我无法将json 字符串反序列化为object。我已经在控制台应用程序中测试了我的代码,它运行良好,没有任何问题。
这里是http请求的代码:
public static async Task<T> Put<T>(string url,object data)
{
var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
var response = await client.PutAsync(url,content);
response.EnsureSuccessStatusCode();
string str = await response.Content.ReadAsStringAsync();
Debug.WriteLine(str);
return JsonConvert.DeserializeObject<T>(str);
}
public static async Task<T> Get<T>(string url)
{
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string str = await response.Content.ReadAsStringAsync();
Debug.WriteLine(str);
return JsonConvert.DeserializeObject<T>(str);
}
这是发送实际请求的代码:
Models.Position pos = await Network.Put<Models.Position>("positions/set", new { longitude = l.Longitude, latitude = l.Latitude });
List<Models.Position> positions = await Network.Get<List<Models.Position>>("positions");
【问题讨论】:
-
也许专注于修复发送畸形 JSON 的服务器?这肯定是最简单的解决方法。
-
@DavidG 正如我在服务器响应正常之前所说的那样。我已经在控制台应用程序中对其进行了测试。
-
我也会检查服务器端。首先要注意的是包含换行符
\x000a的字符串在传输层上扩展为 CRLF\x000d\x000a,这将丢弃在服务器端计算的 Content-Length。客户端将读取 Content-Length 八位字节并在您的最后一个]字符之前停止。 -
@AlwaysLearning 服务器使用 laravel 并返回这个 return response()->json(Position::where('last_updated','>',Carbon::now()->subMinutes(30) )->get(),200);
-
从请求末尾随机删除单个字符是非常不寻常的。 HTTP 是一个非常健壮的协议,如果传输出现问题,
HttpClient几乎肯定会给您带来非常不同的错误。所以要么: 1 - 服务器正在发送错误数据,您需要修复它; 2 - 你的客户端代码做错了(这段代码很好,不会给你这个问题);或 3 - 您错误地删除了最后一个字符,只有您自己才能弄清楚。
标签: c# json xamarin xamarin.forms