【 在 hgoldfish 的大作中提到: 】
: 我要有空就把 qtng 改成基于 c++20 coroutine.. qtng 是 2017 年开工的,那时候 boost::coroutine 非常难用
:
【 在 hgoldfish 的大作中提到: 】
: 我要有空就把 qtng 改成基于 c++20 coroutine.. qtng 是 2017 年开工的,那时候 boost::coroutine 非常难用
:
简单看了下你的 Http Client ,我想讨论下我看到的几个问题(不讨论协程部分):
1. HttpSession 没有找到 Cancel 机制
这个在 UI 开发中很重要,比如 Dialog 关闭,需要 Cancel 掉当前页面发出的所有 Http 请求
2. FormData 的 addFile(const QString &name, const QString &filename, const QByteArray &data, const QString &contentType = QString()) 接口设计的不太合理
上传一个大文件的话,把文件作为 QByteArray 全部加载到内存里是不能接受的
(这里用 QMimeDatabase 自动加载 Mime type 的设计不错)
3. setBody() 的设计不错, 通过参数类型设置 multipart/form-data application/json application/x-www-form-urlencoded
但是
a. 因为 post 接受的只是 QByteArray ,所以造成了问题2,可以改成 QDataStream 或者 std::basic_iostream
b. 除了内置的三个 content-type 之外,只提供了 setBody(const QByteArray &body) 一个通用方法(这里还遗漏了 content-type),使扩展性打了折扣
我想了想,感觉这里可以设计成这样的一个interface
struct post_body {
std::basic_iostream stream;
size64_t length;
std::string content_type;
};
class body_generator_interface {
public:
virtual post_body generator_body() = 0;
};
其他类型都继承该 interface 来实现。
然后真正 HttpSessionPrivate::send() 的时候,调用 generator_body() 来获取 content_type content-length 和 body stream
--
FROM 124.251.33.*