188 lines
5.1 KiB
C++
188 lines
5.1 KiB
C++
/*
|
|
* @build make examples
|
|
*
|
|
* @server bin/http_server_test 8080
|
|
*
|
|
* @client bin/http_client_test
|
|
*
|
|
*/
|
|
|
|
#include "requests.h"
|
|
#include "axios.h"
|
|
using namespace hv;
|
|
|
|
#include "hthread.h" // import hv_gettid
|
|
|
|
static void test_http_async_client(HttpClient* cli, int* resp_cnt) {
|
|
printf("test_http_async_client request thread tid=%ld\n", hv_gettid());
|
|
auto req = std::make_shared<HttpRequest>();
|
|
req->method = HTTP_POST;
|
|
req->url = "http://127.0.0.1:8080/echo";
|
|
req->headers["Connection"] = "keep-alive";
|
|
req->body = "This is an async request.";
|
|
req->timeout = 10;
|
|
cli->sendAsync(req, [resp_cnt](const HttpResponsePtr& resp) {
|
|
printf("test_http_async_client response thread tid=%ld\n", hv_gettid());
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
*resp_cnt += 1;
|
|
});
|
|
}
|
|
|
|
static void test_http_sync_client(HttpClient* cli) {
|
|
HttpRequest req;
|
|
req.method = HTTP_POST;
|
|
req.url = "http://127.0.0.1:8080/echo";
|
|
req.headers["Connection"] = "keep-alive";
|
|
req.body = "This is a sync request.";
|
|
req.timeout = 10;
|
|
HttpResponse resp;
|
|
int ret = cli->send(&req, &resp);
|
|
if (ret != 0) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp.status_code, resp.status_message());
|
|
printf("%s\n", resp.body.c_str());
|
|
}
|
|
}
|
|
|
|
static void test_requests() {
|
|
// auto resp = requests::get("http://www.example.com");
|
|
//
|
|
// make clean && make WITH_OPENSSL=yes
|
|
// auto resp = requests::get("https://www.baidu.com");
|
|
|
|
auto resp = requests::get("http://127.0.0.1:8080/ping");
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
|
|
// Content-Type: application/json
|
|
hv::Json jroot;
|
|
jroot["user"] = "admin";
|
|
jroot["pswd"] = "123456";
|
|
http_headers headers;
|
|
headers["Content-Type"] = "application/json";
|
|
resp = requests::post("http://127.0.0.1:8080/echo", jroot.dump(), headers);
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
|
|
// Content-Type: multipart/form-data
|
|
std::map<std::string, std::string> params;
|
|
params["user"] = "admin";
|
|
params["pswd"] = "123456";
|
|
resp = requests::uploadFormFile("http://127.0.0.1:8080/echo", "avatar", "avatar.jpg", params);
|
|
if (resp == NULL) {
|
|
printf("uploadFormFile failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
|
|
/*
|
|
size_t filesize = requests::downloadFile("http://www.example.com/index.html", "index.html");
|
|
if (filesize == 0) {
|
|
printf("downloadFile failed!\n");
|
|
} else {
|
|
printf("downloadFile success!\n");
|
|
}
|
|
*/
|
|
|
|
// async
|
|
/*
|
|
// auto req = std::make_shared<HttpRequest>();
|
|
req->url = "http://127.0.0.1:8080/echo";
|
|
req->method = HTTP_POST;
|
|
req->body = "This is an async request.";
|
|
req->timeout = 10;
|
|
requests::async(req, [](const HttpResponsePtr& resp) {
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
});
|
|
*/
|
|
}
|
|
|
|
static void test_axios() {
|
|
const char* strReq = R"(
|
|
{
|
|
"method": "POST",
|
|
"url": "http://127.0.0.1:8080/echo",
|
|
"timeout": 10,
|
|
"params": {
|
|
"page_no": "1",
|
|
"page_size": "10"
|
|
},
|
|
"headers": {
|
|
"Content-Type": "application/json"
|
|
},
|
|
"body": {
|
|
"app_id": "123456",
|
|
"app_secret": "abcdefg"
|
|
}
|
|
}
|
|
)";
|
|
|
|
// sync
|
|
auto resp = axios::axios(strReq);
|
|
// auto resp = axios::post("http://127.0.0.1:8080/echo", strReq);
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
|
|
// async
|
|
/*
|
|
axios::axios(strReq, [](const HttpResponsePtr& resp) {
|
|
if (resp == NULL) {
|
|
printf("request failed!\n");
|
|
} else {
|
|
printf("%d %s\r\n", resp->status_code, resp->status_message());
|
|
printf("%s\n", resp->body.c_str());
|
|
}
|
|
});
|
|
*/
|
|
}
|
|
|
|
int main(int argc, char* argv[]) {
|
|
int req_cnt = 0;
|
|
if (argc > 1) req_cnt = atoi(argv[1]);
|
|
if (req_cnt == 0) req_cnt = 1;
|
|
|
|
HttpClient sync_client;
|
|
HttpClient async_client;
|
|
int resp_cnt = 0;
|
|
|
|
for (int i = 0; i < req_cnt; ++i) {
|
|
test_http_async_client(&async_client, &resp_cnt);
|
|
|
|
test_http_sync_client(&sync_client);
|
|
|
|
test_requests();
|
|
|
|
test_axios();
|
|
}
|
|
|
|
// demo wait async finished
|
|
while (resp_cnt < req_cnt) hv_delay(100);
|
|
printf("finished!\n");
|
|
|
|
return 0;
|
|
}
|