OAT++ 1.3.0发送超8KB JSON payload被截断的解决方法问询
解决OAT++ 1.3.0客户端发送超大JSON Payload被截断的问题
问题根源
OAT++ 1.3.0的BODY_STRING_JSON宏默认使用8KB(8192字节)的固定缓冲区,当JSON内容超出这个长度时会被精准截断,导致服务端返回JSON解析错误。
两种可行解决方案
方案1:扩大BODY_STRING_JSON的缓冲区上限
在API声明时,显式指定更大的缓冲区尺寸,替换原有宏定义:
API_CALL("POST", "{svcPath}", postServiceOauth, PATH(String, svcPath), HEADER(String, myHeader, "Content-Type"), AUTHORIZATION(String, authString, "Bearer"), // 这里指定64KB缓冲区,可根据实际需求调整数值 BODY_STRING_JSON(String, body, 65536) )
第三个参数为缓冲区最大字节数,设置为你需要的阈值即可。
方案2:流式传递Body(适合超大型Payload)
如果JSON内容极大,建议用流式方式发送,避免一次性占用过多内存。改用BODY_STREAM宏实现:
第一步:修改API声明
API_CALL("POST", "{svcPath}", postServiceOauth, PATH(String, svcPath), HEADER(String, myHeader, "Content-Type"), AUTHORIZATION(String, authString, "Bearer"), BODY_STREAM(std::shared_ptr<oatpp::data::stream::InputStream>, bodyStream) )
第二步:调用时构造流对象
// 假设largeJson是你的超大JSON字符串 std::string largeJson = "你的超长JSON内容..."; // 将字符串包装为OAT++的StringStream auto bodyStream = oatpp::data::stream::StringStream::createShared(largeJson); // 发起API调用 auto response = postServiceOauth("目标服务路径", "application/json", "Bearer 你的令牌", bodyStream);
验证修改
重新编译客户端后,发送超过8KB的JSON payload,确认服务端能正常解析,不再出现"偏移量8192处提前遇到文件结束"的错误提示。
内容的提问来源于stack exchange,提问作者Christophe H
相关产品推荐
相关产品推荐

