gpt4 book ai didi

Flutter:HttpClient 发布 contentLength——异常

转载 作者:IT王子 更新时间:2023-10-29 06:55:18 25 4
gpt4 key购买 nike

很奇怪...

为了将一些 JSON 数据发布到我的服务器,我将 contentLength 定义为 JSON 编码数据的长度,但随后我收到一个异常,提示“内容大小超过指定的 contentLength”。相差1个字节。

这是源代码:

Future<Map> ajaxPost(String serviceName, Map data) async {
var responseBody = json.decode('{"data": "", "status": "NOK"}');
try {
var httpClient = new HttpClient();
var uri = mid.serverHttps ? new Uri.https(mid.serverUrl, _serverApi + serviceName)
: new Uri.http(mid.serverUrl, _serverApi + serviceName);
var request = await httpClient.postUrl(uri);
var body = json.encode(data);

request.headers
..add('X-mobile-uuid', await _getDeviceIdentity())
..add('X-mobile-token', await mid.getMobileToken());

request.headers.contentLength = body.length;
request.headers.set('Content-Type', 'application/json; charset=utf-8');
request.write(body);

var response = await request.close();
if (response.statusCode == 200){
responseBody = json.decode(await response.transform(utf8.decoder).join());

//
// If we receive a new token, let's save it
//
if (responseBody["status"] == "TOKEN"){
await mid.setMobileToken(responseBody["data"]);

// Let's change the status to "OK", to make it easier to handle
responseBody["status"] = "OK";
}
}
} catch(e){
// An error was received
throw new Exception("AJAX ERROR");
}
return responseBody;
}

其他时候,它工作正常...

这段代码我做错了吗?

非常感谢您的帮助。

使用解决方案编辑:

非常感谢您的帮助。使用 utf8.encode(json.encode(data)) 的简单事实并没有完全起作用。所以,我求助于 http 库,它现在工作得很好。代码更轻!

这是新版本的代码:

Future<Map> ajaxPut(String serviceName, Map data) async {
var responseBody = json.decode('{"data": "", "status": "NOK"}');
try {
var response = await http.put(mid.urlBase + '/$_serverApi$serviceName',
body: json.encode(data),
headers: {
'X-mobile-uuid': await _getDeviceIdentity(),
'X-mobile-token': await mid.getMobileToken(),
'Content-Type': 'application/json; charset=utf-8'
});

if (response.statusCode == 200) {
responseBody = json.decode(response.body);

//
// If we receive a new token, let's save it
//
if (responseBody["status"] == "TOKEN") {
await mid.setMobileToken(responseBody["data"]);

// Let's change the status to "OK", to make it easier to handle
responseBody["status"] = "OK";
}
}
} catch (e) {
// An error was received
throw new Exception("AJAX ERROR");
}
return responseBody;
}

最佳答案

我得到它的工作

req.headers.contentLength = utf8.encode(body).length;

来自 Utf8Codec 的间接提示说明的文档

decode(List codeUnits, { bool allowMalformed }) → String

Decodes the UTF-8 codeUnits (a list of unsigned 8-bit integers) to the corresponding string.

这意味着utf8.encode()返回 codeUnits这实际上意味着 List<uint8> .

理论上,对字符串有效负载进行编码会返回一个列表,其长度是有效负载的字节长度。

所以使用 httpClient表示始终以字节为单位测量有效负载的长度,而不是可能不同的字符串的长度。

关于Flutter:HttpClient 发布 contentLength——异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50089550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com