You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Flutter GetX实现全类型HTTP API请求(已完成Get请求)

用Flutter GetX实现全类型HTTP API请求

GetX的HTTP请求核心依赖GetConnect类,你可以把请求逻辑封装在一个单独的服务类或GetX控制器里。下面是除Get请求外,各类HTTP请求的实现方式:

基础服务类初始化

先创建一个基础的API服务类,统一配置基础URL、超时、拦截器等:

class ApiService extends GetConnect {
  final String baseUrl = 'https://api.example.com';

  @override
  void onInit() {
    super.onInit();
    httpClient.baseUrl = baseUrl;
    httpClient.timeout = const Duration(seconds: 10);
    // 可选:统一处理响应拦截
    httpClient.addResponseModifier((request, response) {
      if (response.statusCode >= 400) {
        print('API错误: ${response.statusText}');
      }
      return response;
    });
  }
}

POST 请求(JSON 体)

用于提交JSON格式的新资源:

// 在ApiService类中添加方法
Future<Response> postJsonData(Map<String, dynamic> payload) async {
  try {
    return await post('/users', payload);
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用方式
final apiService = Get.put(ApiService());
apiService.postJsonData({'name': 'Alice', 'email': 'alice@example.com'}).then((res) {
  if (res.statusCode == 201) {
    print('创建成功: ${res.body}');
  } else {
    print('创建失败: ${res.statusText}');
  }
});

PUT 请求(完整更新资源)

用于替换或更新整个资源:

// 在ApiService类中添加方法
Future<Response> putFullData(int userId, Map<String, dynamic> payload) async {
  try {
    return await put('/users/$userId', payload);
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用
apiService.putFullData(1, {'name': 'Alice Updated', 'email': 'alice_new@example.com'}).then((res) {
  if (res.statusCode == 200) {
    print('更新完成');
  }
});

DELETE 请求(删除资源)

用于移除指定资源:

// 在ApiService类中添加方法
Future<Response> deleteResource(int userId) async {
  try {
    return await delete('/users/$userId');
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用
apiService.deleteResource(1).then((res) {
  if (res.statusCode == 204) {
    print('删除成功');
  }
});

PATCH 请求(部分更新资源)

仅更新资源的部分字段:

// 在ApiService类中添加方法
Future<Response> patchPartialData(int userId, Map<String, dynamic> payload) async {
  try {
    return await patch('/users/$userId', payload);
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用
apiService.patchPartialData(1, {'email': 'alice_updated@example.com'}).then((res) {
  print('部分更新完成');
});

Form Data 请求(表单编码)

发送application/x-www-form-urlencoded格式的表单数据:

// 在ApiService类中添加方法
Future<Response> sendFormUrlEncoded(Map<String, String> formData) async {
  try {
    return await post(
      '/login',
      formData,
      contentType: Headers.formUrlEncodedContentType,
    );
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用
apiService.sendFormUrlEncoded({'username': 'alice', 'password': '123456'}).then((res) {
  if (res.statusCode == 200) {
    print('登录成功');
  }
});

Multipart 请求(文件上传)

用于上传文件(图片、文档等):

// 在ApiService类中添加方法
Future<Response> uploadFile(File file, String description) async {
  try {
    final form = FormData({
      'avatar': MultipartFile(file, filename: file.path.split('/').last),
      'description': description,
    });
    return await post('/upload/avatar', form);
  } catch (e) {
    return Response(statusCode: 500, statusText: e.toString());
  }
}

// 使用(示例:从本地路径选择文件)
final selectedFile = File('/storage/emulated/0/Download/avatar.jpg');
apiService.uploadFile(selectedFile, '个人头像').then((res) {
  if (res.statusCode == 200) {
    print('上传成功');
  }
});

结合GetX状态管理更新UI

可以把请求逻辑放到GetX控制器中,配合响应式变量自动更新UI:

class UserController extends GetxController {
  final ApiService apiService = ApiService();
  final RxList<Map<String, dynamic>> users = RxList([]);

  Future<void> fetchUsers() async {
    final res = await apiService.get('/users');
    if (res.statusCode == 200) {
      users.assignAll(List<Map<String, dynamic>>.from(res.body));
    }
  }
}

// 在UI中使用
final controller = Get.put(UserController());
Obx(() => ListView.builder(
  itemCount: controller.users.length,
  itemBuilder: (context, index) => ListTile(
    title: Text(controller.users[index]['name']),
  ),
));

内容的提问来源于stack exchange,提问作者Abhijeet Vishwakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:20:41