CJSON_DIRECT_H_

#ifndef _CJSON_DIRECT_H_
#define _CJSON_DIRECT_H_




typedef enum {
	KEY_TYPE_NULL,
	KEY_TYPE_U8,
	KEY_TYPE_U16,
	KEY_TYPE_U32,
	KEY_TYPE_FLOAT,
	KEY_TYPE_DOUBLE,
	KEY_TYPE_STRING,
	KEY_TYPE_OBJECT,
	KEY_TYPE_ARRAY,///< 注意,对于基本数组,只支持32位
	KEY_TYPE_MAX
}key_type_e;




typedef struct key_info_s{
	int csize;					///< 本结构体大小
	key_type_e type;				///< 成员类型
	char *key;					///< 成员名称
	int offset;					///< 成员偏移地址
	int ksize;						///< 成员大小
	struct key_info_s *sub_key;	///< 对于#KEY_TYPE_OBJECT类型,其具体类型定义
	int arraycnt;					///< 对于#KEY_TYPE_ARRAY类型,其个数
	key_type_e arraytype;		///< 对于#KEY_TYPE_ARRAY类型,其成员的类型
}key_info_t;




/*成员在结构体中的偏移地址*/
#define NAME_OFFSET(type,name) ((int)(&(((type *)0)->name)))
#define NAME_SIZE(type,name) (sizeof((((type *)0)->name)))




/**
 *@brief 形成结构体
 *@param ctype 结构体类型
 *@param ktype 成员类型
 *@param kname 成员名
 *@param subkey 如果keytype为#KEY_TYPE_OBJECT,则为其对应结构体的#key_info_t 指针
 *@param arraycnt 对于#KEY_TYPE_ARRAY类型,其个数
 *@param arraytype 对于#KEY_TYPE_ARRAY类型,其成员的类型
 *
 */
#define MAKE_ARRAY_INFO(ctype, ktype, kname, subkey, arraycnt, arraytype) {sizeof(ctype), ktype, #kname, NAME_OFFSET(ctype,kname), NAME_SIZE(ctype,kname), subkey, arraycnt, arraytype}


#define MAKE_KEY_INFO(ctype, ktype, kname, subkey) MAKE_ARRAY_INFO(ctype, ktype, kname, subkey, 0, KEY_TYPE_NULL)
#define MAKE_END_INFO()	{0, KEY_TYPE_NULL, NULL, 0, 0, NULL}




/**
 *@brief 
 *@param kinfo 输入 结构体信息,用于识别结构体各成员
 *@param string 输入 要转化的字符串
 *@param obj 输出 结构体指针。如果为NULL,会自动分配内存,需要释放
 *
 *@return obj。失败时返回NULL
 *
 */
void *cjson_string2object(key_info_t *kinfo, char *string, void *obj);


/**
 *@brief 
 *@param kinfo 输入 结构体信息,用于识别结构体各成员
 *@param obj 输入 要转化的结构体地址
 *
 *@return json格式的字符串。NULL if failed
 *
 *@note 其返回的字符串,需要用free释放
 *
 */
char *cjson_object2string(key_info_t *kinfo, void *obj);


#endif


#include <WS2tcpip.h> #include <iostream> #include <regex> #include <unordered_map> #include "cJSON/cJSON.h" #include <future> #include <string> #include <vector> #include <wininet.h> #include <map> #include <Common/Data.h> #pragma comment(lib, "wininet.lib") class Rank { public: std::string sendGetRequestWithWininet(const std::string& host, int port, const std::string& path) { HINTERNET hInternet = InternetOpenA("WinINet Example", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (!hInternet) { return ""; } HINTERNET hConnect = InternetConnectA(hInternet, host.c_str(), port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (!hConnect) { InternetCloseHandle(hInternet); return ""; } const char* acceptTypes[] = { "*/*", NULL }; HINTERNET hRequest = HttpOpenRequestA(hConnect, "GET", path.c_str(), NULL, NULL, acceptTypes, INTERNET_FLAG_RELOAD, 0); if (!hRequest) { InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return ""; } const char* headers = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36\r\n"; if (!HttpSendRequestA(hRequest, headers, strlen(headers), NULL, 0)) { InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return ""; } std::string response; char buffer[4096]; DWORD bytesRead; while (InternetReadFile(hRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead != 0) { response.append(buffer, bytesRead); } InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return response; } std::string sendPostRequestWithWininet(const std::string& host, int port, const std::string& path,
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值