Flutter/Dart调用Infobip SMS批量API时POST请求未授权报错
解决Infobip SMS API调用的未授权问题
你遇到的UNAUTHORIZED错误主要是因为Header设置错误,同时请求体格式也存在问题,下面是具体的修正方案:
问题分析
- Header设置完全错误:你把
Authorization、Content-Type等所有Header都塞进了HttpHeaders.contentTypeHeader对应的字段里,这会导致服务器无法正确识别授权信息,直接返回未授权错误。 - 请求体格式错误:手动拼接JSON字符串时格式混乱,用Map包裹字符串的写法完全不符合API要求。
修正方案
方案1:修复原生HttpClient代码
import 'dart:convert'; import 'dart:io'; data() async { final client = HttpClient(); final url = Uri.parse("https://....api.infobip.com/sms/2/text/advanced"); final request = await client.postUrl(url); // 正确设置每个Header,单独调用set方法 request.headers.set('Authorization', 'App YOUR_API_KEY'); // 替换为你的真实密钥 request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); request.headers.set(HttpHeaders.acceptHeader, 'application/json'); // 用jsonEncode将Dart对象转为标准JSON字符串,避免手动拼接出错 final body = jsonEncode({ "messages": [ { "from": "sms", "destinations": [{"to": "TARGET_PHONE_NUMBER"}], // 替换为目标号码(带国家区号) "text": "ABC" } ] }); request.write(body); final response = await request.close(); response.transform(utf8.decoder).listen((contents) { print(contents); }); }
方案2:使用更简洁的http包(推荐)
原生HttpClient相对底层,使用http包可以大幅简化代码,降低出错概率:
- 先在
pubspec.yaml中添加依赖:
dependencies: http: ^1.1.0
- 修正后的代码:
import 'package:http/http.dart' as http; import 'dart:convert'; data() async { final url = Uri.parse("https://....api.infobip.com/sms/2/text/advanced"); final headers = { 'Authorization': 'App YOUR_API_KEY', 'Content-Type': 'application/json', 'Accept': 'application/json' }; final body = jsonEncode({ "messages": [ { "from": "sms", "destinations": [{"to": "TARGET_PHONE_NUMBER"}], "text": "ABC" } ] }); final response = await http.post(url, headers: headers, body: body); print(response.body); }
关键注意事项
- 确保
YOUR_API_KEY替换为Infobip后台获取的真实授权密钥,格式为App XXXXXXXXXXXX(注意App后有空格)。 - 目标号码
to必须包含国家区号(例如中国大陆号码格式为+8613xxxxxxxxx)。 - 确认你的Infobip账户状态正常,无欠费或权限限制。
内容的提问来源于stack exchange,提问作者Mr. Poopybutthole
相关产品推荐
相关产品推荐

