提交 7a573c98 编写于 作者: xc13262215230's avatar xc13262215230

cs348_httpclient请求回调函数功能新增

上级 f6ba895c
......@@ -632,7 +632,8 @@ TCP&UDP
使用http/url访问网络上的主机,发起http网络请求,类似采用
jquery发起的POST/GET网络请求。
118.http://code.jquery.com/jquery-1.11.0.min.js
118.jquery实现功能简介:
http://code.jquery.com/jquery-1.11.0.min.js
[http://] // http或者更安全的https
[code.jquery.com] // 主机名或域名
......@@ -641,8 +642,8 @@ $.get('http://127.0.0.1:4568/add?c=10&d=20', { a: 15, b: 7, e: "hahaha" },
{
console.log(n, "data=", data, "status=", status);
});
1)通过url发起回调,并传入参数,并注册回调函数(可以是匿名函数或lambda表达式)
2)收到服务器应答消息后触发回调函数
1)通过url发起请求(GET),并传入参数,并注册回调函数(可以是匿名函数或lambda表达式)
2)收到服务器应答消息后(比如百度这个web服务器),并触发回调函数
3)域名+端口;IP+端口;
119.单步调试是定位问题推荐的方式。
......@@ -658,18 +659,18 @@ $.get('http://127.0.0.1:4568/add?c=10&d=20', { a: 15, b: 7, e: "hahaha" },
的应答消息,但是,并没有去正确解析这个web服务器的应答消息。
113.http服务端采用的HttpClient.hpp和http客户端采用的HttpClient.hpp行为
123.http服务端采用的HttpClient.hpp和http客户端采用的HttpClient.hpp行为
并不完全一样。比如,HTTP服务端采用的[HttpClient.hpp::CheckHttpRequest]
是浏览器等httpclient发起数据请求,HTTP服务端(简易的web服务器)收到这个
数据请求后,检查http请求的具体类型用的。
当前需要定义一个新的HttpClient.hpp来给http客户端使用。
114.编程建议:采用参数传递而不是类的属性,这样的设计可以一定程度降低
124.编程建议:采用参数传递而不是类的属性,这样的设计可以一定程度降低
数据的高耦合性。
115.c++标准库std的头文件可以多次重复包含,因为其做了防止被多次包含的处理。
125.c++标准库std的头文件可以多次重复包含,因为其做了防止被多次包含的处理。
116.httpclient向百度web服务器发送http数据请求后,百度web服务器发送过来的数据应答消息:
126.httpclient向百度web服务器发送http数据请求后,百度web服务器发送过来的数据应答消息:
HTTP/1.1 200 OK\r\n // http响应行(应答行)
Accept-Ranges: bytes\r\n // http响应头(应答头)
Cache-Control: no-cache\r\n
......@@ -680,27 +681,27 @@ Date: Thu, 11 Jan 2024 14:24:00 GMT\r\n
P3p: CP=\" OTI DSP COR IVA OU... \r\n
\r\n
117.数据请求和数据应答:
127.数据请求和数据应答:
数据请求:客户端发送给服务端的消息。
数据应答:服务端发送给客户端的消息。
118.思维抽象:发现问题->分析问题->解决问题->验证问题。
128.思维抽象:发现问题->分析问题->解决问题->验证问题。
119.接收缓冲区大小设计分析:
129.接收缓冲区大小设计分析:
静态设计,固定大小,如果一条消息很长,超过缓冲区固定大小,就会出现消息接收异常。
动态设计,根据接收到的实际消息长度动态申请缓冲区大小,以接收消息,存在安全风险。
120.httpclient当前已经实现向百度这个web服务器发送请求,并且正确收到其发送的数据
130.httpclient当前已经实现向百度这个web服务器发送请求,并且正确收到其发送的数据
应答消息。
121.调式技巧:
131.调式技巧:
visual studio工具->快速监视->添加变量和字节数[var, 1024]->重新计算,可以
以监视这个变量后面指定字节数内存所有的当前数值。
122.当前的httpclient客户端已经可以向网络服务器比如百度服务器发送http数据
132.当前的httpclient客户端已经可以向网络服务器比如百度服务器发送http数据
请求,并接收web服务器的数据应答,和正确解析。
123.控制台输出乱码问题处理[方法论抽象]:
133.控制台输出乱码问题处理[方法论抽象]:
1)分析问题,现象,控制台输出,中文出现乱码,并且输出信息不完整。通过
日志可以确定收到的数据是完整的,只是显示不完整。
2)百度或AI搜索问题,关键词,关键词应该准确,并越多搜到的结论越接近
......@@ -710,12 +711,15 @@ visual studio工具->快速监视->添加变量和字节数[var, 1024]->重新
5)结论:
设置控制台输出支持UTF-8格式字符串即可。
124.跨平台代码:可以采用系统特定宏定义来区分不同操作系统下特殊执行的
134.跨平台代码:可以采用系统特定宏定义来区分不同操作系统下特殊执行的
代码段。
125.visual studio ide 集成开发环境,采用快捷键[ctrl + f5]可以直接编译
135.visual studio ide 集成开发环境,采用快捷键[ctrl + f5]可以直接编译
源码并执行并执行过程中不触发断点模式。
136.当前项目httpclient实现的功能要同118-jquery实现流程保持一致。c++与js存在
差异,但是应该具备类似功能,应用性应该更高。采用c++11只有的才有的回调方法方式。
......
......@@ -9,6 +9,9 @@ using namespace doyou::io;
class MyHttpClient : public TcpHttpClient
{
private:
typedef std::function<void(HttpClientC*)> EventCall; // 定义一个function函数类型(c++11及以上才支持)
Please register or sign in to reply
public:
MyHttpClient() // 构造函 数
{
......@@ -25,8 +28,6 @@ public:
// 分析:当采用httpclient收到的应答消息不是按照二进制数据流形式,而是采用json字符串形式传输的,要单独匹配处理
virtual void OnNetMsg(netmsg_DataHeader* header) override // 重写继承自父类的纯虚函数
{
CELLLog_Info("[OnNetMsg] recv server msg");
HttpClientC* pHttpClient = dynamic_cast<HttpClientC*>(_pClient); // 将父类指针强转为子类指针
if (nullptr == pHttpClient) {
CELLLog_Error("nullptr == pHttpClient");
......@@ -38,16 +39,18 @@ public:
return;
}
auto responseStr = pHttpClient->Content();
CELLLog_Info("[body=%s]\n", responseStr);
if (_onRespCall != nullptr) {
_onRespCall(pHttpClient); // 触发应答消息回调函数
Please register or sign in to reply
}
return;
}
// 发送HTTP/GET数据请求网络消息
void Get(char const* httpUrl)
void Get(char const* httpUrl, EventCall onRespCall)
{
Please register or sign in to reply
_onRespCall = onRespCall; // 注册回调函数
DetachHttpUrl(httpUrl);
if (0 == HostName2Ip(_host.c_str(), _port.c_str())) {
......@@ -250,7 +253,7 @@ private:
std::string _path; // 资源路径
std::string _args; // 参数[?后面部分]
EventCall _onRespCall = nullptr; // 回调函数
};
......@@ -277,7 +280,13 @@ int main(int argc, char* args[])
//httpClient.Get("http://127.0.0.1:4568/add?c=10&d=20");
//httpClient.Get("ipv6.dosfu.com");
//httpClient.Get("dosfu.com");
httpClient.Get("https://www.baidu.com/"); // 获取外网域名IP列表
httpClient.Get("https://www.baidu.com/", [](HttpClientC* pHttpClient){ // lambda表达式作为实参
Please register or sign in to reply
CELLLog_Info("[httpclient] recv http web server msg.");
Please register or sign in to reply
//auto responseStr = pHttpClient->Content();
//CELLLog_Info("[body=%s]\n", responseStr);
}); // 获取外网域名IP列表
//httpClient.Get("https://www.baidu.com"); // 获取外网域名IP列表
//httpClient.Get(hname); // 根据计算机名称获取IP列表
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册