Xamarin中通过API更新数据无报错但数据库未更新如何解决
问题排查结论
- 核心错误:PUT请求提交的数据对象不符合接口要求
你在循环中修改的是单个评分记录r的ViewStorer字段,但序列化提交数据时错误传入了res.RatingStores整个集合对象。你用Postman/Swagger测试时提交的是单个资源对象,接口可以正常解析,而代码中提交集合会触发接口参数校验不通过,自然不会执行更新逻辑。 - 隐藏问题:未捕获接口响应的错误信息
你当前的代码没有判断PutAsync的返回状态码,即使接口返回400参数错误、401权限错误等异常状态,只要请求本身发送成功,就不会触发运行时错误,导致你看不到接口的具体报错提示。 - 其他优化点:
- 循环中
r.ID = r.ID这类自身赋值的代码完全多余,可直接删除 - 不要每次调用方法都实例化新的
HttpClient,建议复用静态单例HttpClient避免套接字资源泄漏
- 循环中
修复后参考代码
// 建议将HttpClient改为静态单例,不要在方法内重复实例化 private static readonly HttpClient _client = new HttpClient(); public async Task UpdateViewRatingStore(bool value) { var url = baseUrl + userget; _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", mytokenlogin); string jsonStr = await _client.GetStringAsync(url); var res = JsonConvert.DeserializeObject<Customer>(jsonStr); var checkunredrating = res.RatingStores; if (checkunredrating != null) { foreach (var r in checkunredrating) { // 删掉多余的自身赋值代码,只保留需要修改的字段 r.ViewStorer = value; var urlput = baseUrlStoreRating + r.ID; // 仅序列化当前修改的单个r对象,而非整个集合 var stringContent = new StringContent(JsonConvert.SerializeObject(r), Encoding.UTF8, "application/json"); // 接收响应并校验状态 var response = await _client.PutAsync(urlput, stringContent); // 调试时可以打印以下内容查看接口返回信息 // var statusCode = response.StatusCode; // var responseContent = await response.Content.ReadAsStringAsync(); response.EnsureSuccessStatusCode(); // 接口返回非2xx状态码时会抛出异常,方便定位问题 } } }
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

