如何在Flutter中发送PUT请求?解决更新JSONStorage上JSON列表时出现415响应码的问题
一、Flutter中PUT请求的实现方式
我会用官方的http包来演示,这是最常用的网络请求方式之一:
- 首先在
pubspec.yaml中添加依赖:
dependencies: http: ^1.1.0
执行flutter pub get完成依赖安装。
- 编写PUT请求代码:
假设你要更新JSONStorage上的整个列表,代码示例如下:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> updateJsonList() async { // 替换成你的JSONStorage资源专属URL final url = Uri.parse('https://app.jsonstorage.net/api/v1/json/your-resource-id'); // 基于原数据修改后的新内容 final updatedData = [ {"username": "Amirhossein", "password": "302940101692", "email": "sahosseini1382@gmail.com", "phone": "09944236807"}, {"username": "Hosna Updated", "password": "74610945", "email": "hosseiniamir71@gmail.com", "phone": "09353792083"} ]; try { final response = await http.put( url, headers: { // 核心:必须设置正确的内容类型头 'Content-Type': 'application/json', // 如果你的资源是私有,这里要添加JSONStorage要求的认证头,比如API密钥 // 'Authorization': 'Bearer your-api-key' }, // 将Dart对象编码为标准JSON字符串 body: jsonEncode(updatedData), ); if (response.statusCode == 200) { print('数据更新成功!'); print('响应内容:${response.body}'); } else { print('更新失败,状态码:${response.statusCode}'); print('响应内容:${response.body}'); } } catch (e) { print('请求出错:$e'); } }
如果你习惯用dio包,代码会更简洁,示例如下:
import 'package:dio/dio.dart'; Future<void> updateJsonListWithDio() async { final dio = Dio(); final url = 'https://app.jsonstorage.net/api/v1/json/your-resource-id'; final updatedData = [ // 你的更新数据 ]; try { final response = await dio.put( url, data: updatedData, options: Options( headers: { 'Content-Type': 'application/json', // 如有需要添加认证头 }, ), ); print('更新成功:${response.data}'); } on DioException catch (e) { print('请求失败:${e.response?.statusCode} - ${e.response?.data}'); } }
二、排查415错误(Unsupported Media Type)的原因和解决方法
你收到的415错误,本质是服务器无法识别你发送的请求体的媒体类型,结合JSONStorage的使用场景,主要有以下几个可能:
未设置
Content-Type: application/json请求头
这是最常见的原因!JSONStorage要求PUT请求的请求体是JSON格式,必须在请求头里明确告知服务器你发送的是JSON数据。如果没加这个头,服务器会默认识别为其他格式(比如form-data),直接返回415。解决方法就是在PUT请求的headers里加上这个字段,参考上面的代码示例。请求体不是有效的JSON格式
比如你直接把Dart对象传给body,没有用jsonEncode(http包)处理,导致发送的是Dart对象的字符串形式(比如[Instance of 'Map', Instance of 'Map']),这不是标准JSON,服务器无法解析。解决方法:http包必须用jsonEncode()转换,dio包则会自动帮你完成编码。请求格式不符合JSONStorage要求
虽然JSONStorage支持直接发送数组,但如果你的更新内容格式和原始数据不一致(比如原始是数组,你却发送了单个对象),也可能触发错误。确保更新的请求体和原始数据结构一致即可。认证信息缺失(间接影响)
如果你的资源是私有,未提供正确的认证头可能导致服务器返回异常状态码,虽然不是直接引发415,但建议确认是否需要添加API密钥等认证信息。
最后验证步骤
- 确认请求头包含
Content-Type: application/json; - 确认请求体是经过
jsonEncode处理的标准JSON字符串; - 可以先用Postman等工具测试PUT请求,确认能成功更新后,再对照着写Flutter代码,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者samirhossein__

