mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
4.2.7
This commit is contained in:
@@ -76,7 +76,7 @@ public class IndexFilter implements WebFilter {
|
|||||||
if (enableRestful && path.startsWith(EnvironmentKeys.SOP_RESTFUL_PATH.getValue())) {
|
if (enableRestful && path.startsWith(EnvironmentKeys.SOP_RESTFUL_PATH.getValue())) {
|
||||||
return chain.filter(exchange);
|
return chain.filter(exchange);
|
||||||
}
|
}
|
||||||
if (Objects.equals(path, indexPath)) {
|
if (Objects.equals(path, indexPath) || "".equals(path)) {
|
||||||
if (request.getMethod() == HttpMethod.POST) {
|
if (request.getMethod() == HttpMethod.POST) {
|
||||||
ServerRequest serverRequest = ServerWebExchangeUtil.createReadBodyRequest(exchange);
|
ServerRequest serverRequest = ServerWebExchangeUtil.createReadBodyRequest(exchange);
|
||||||
// 读取请求体中的内容
|
// 读取请求体中的内容
|
||||||
@@ -140,9 +140,10 @@ public class IndexFilter implements WebFilter {
|
|||||||
validator.validate(apiParam);
|
validator.validate(apiParam);
|
||||||
this.afterValidate(exchange, apiParam);
|
this.afterValidate(exchange, apiParam);
|
||||||
} catch (ApiException e) {
|
} catch (ApiException e) {
|
||||||
log.error("验证失败,url:{}, ip:{}, params:{}, errorMsg:{}",
|
log.error("验证失败, errorMsg:{},url:{}, ip:{}, params:{}",
|
||||||
|
e.getMessage(),
|
||||||
exchange.getRequest().getURI().toString(),
|
exchange.getRequest().getURI().toString(),
|
||||||
apiParam.fetchIp(), apiParam.toJSONString(), e.getMessage());
|
apiParam.fetchIp(), apiParam.toJSONString());
|
||||||
ServerWebExchangeUtil.setThrowable(exchange, e);
|
ServerWebExchangeUtil.setThrowable(exchange, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,13 +17,8 @@ set(LIB_SRC
|
|||||||
request/MemberInfoGetRequest.hpp
|
request/MemberInfoGetRequest.hpp
|
||||||
thirdparty/base64/base64.h
|
thirdparty/base64/base64.h
|
||||||
thirdparty/base64/base64.cpp
|
thirdparty/base64/base64.cpp
|
||||||
thirdparty/CJsonObject/cJSON.c
|
|
||||||
thirdparty/CJsonObject/cJSON.h
|
|
||||||
thirdparty/CJsonObject/CJsonObject.hpp
|
|
||||||
thirdparty/CJsonObject/CJsonObject.cpp
|
|
||||||
thirdparty/x2struct/x2struct.hpp
|
|
||||||
common/sign.cpp common/tool.cpp common/sha256.cpp
|
common/sign.cpp common/tool.cpp common/sha256.cpp
|
||||||
request/BaseRequest.cpp response/BaseResponse.h response/MemberInfoGetResponse.h)
|
request/BaseRequest.cpp)
|
||||||
|
|
||||||
# openssl安装路径
|
# openssl安装路径
|
||||||
set(OPENSSL_INC_DIR /usr/local/opt/openssl/include)
|
set(OPENSSL_INC_DIR /usr/local/opt/openssl/include)
|
||||||
@@ -35,8 +30,16 @@ link_libraries(ssl crypto)
|
|||||||
|
|
||||||
# 添加类库
|
# 添加类库
|
||||||
add_library(lib ${LIB_SRC})
|
add_library(lib ${LIB_SRC})
|
||||||
|
# jsoncpp
|
||||||
|
add_library(jsoncpp SHARED IMPORTED)
|
||||||
|
set_target_properties(jsoncpp PROPERTIES
|
||||||
|
IMPORTED_LOCATION "/usr/local/lib/libjsoncpp.dylib"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include/json"
|
||||||
|
)
|
||||||
|
|
||||||
# 添加可执行文件
|
# 添加可执行文件
|
||||||
add_executable(sdk_cxx main.cpp)
|
add_executable(sdk_cxx main.cpp)
|
||||||
|
|
||||||
# 可执行文件依赖lib库
|
# 可执行文件依赖lib库
|
||||||
target_link_libraries(sdk_cxx lib ssl)
|
target_link_libraries(sdk_cxx lib ssl)
|
||||||
|
target_link_libraries(sdk_cxx jsoncpp)
|
@@ -1,10 +1,9 @@
|
|||||||
|
#include <json/json.h>
|
||||||
#include "OpenClient.h"
|
#include "OpenClient.h"
|
||||||
#include "httplib.h"
|
#include "httplib.h"
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
#include "sign.h"
|
#include "sign.h"
|
||||||
|
|
||||||
#include "../thirdparty/CJsonObject/CJsonObject.hpp"
|
|
||||||
|
|
||||||
httplib::Headers headers = {
|
httplib::Headers headers = {
|
||||||
{"Accept-Encoding", "identity"}
|
{"Accept-Encoding", "identity"}
|
||||||
};
|
};
|
||||||
@@ -13,59 +12,51 @@ const string ERROR_NODE = "error_response";
|
|||||||
|
|
||||||
OpenClient::OpenClient(const string &appId, const string &privateKeyFilePath, const string &url) {
|
OpenClient::OpenClient(const string &appId, const string &privateKeyFilePath, const string &url) {
|
||||||
this->appId = appId;
|
this->appId = appId;
|
||||||
|
this->url = url;
|
||||||
this->privateKeyFilePath = privateKeyFilePath;
|
this->privateKeyFilePath = privateKeyFilePath;
|
||||||
|
|
||||||
char *_url = const_cast<char *>(url.c_str());
|
|
||||||
char *host;
|
|
||||||
int port;
|
|
||||||
char *path;
|
|
||||||
tool::parse_url(_url, &host, &port, &path);
|
|
||||||
this->hostInfo = HostInfo{
|
|
||||||
host = host,
|
|
||||||
port = port,
|
|
||||||
path = path
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
neb::CJsonObject OpenClient::execute(BaseRequest *request) {
|
Json::Value OpenClient::execute(BaseRequest *request) {
|
||||||
return this->execute(request, "");
|
return this->execute(request, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
neb::CJsonObject OpenClient::execute(BaseRequest *request, const string &token) {
|
Json::Value OpenClient::execute(BaseRequest *request, const string &token) {
|
||||||
string method = request->getMethod();
|
string method = request->getMethod();
|
||||||
string version = request->getVersion();
|
string version = request->getVersion();
|
||||||
RequestType requestType = request->getRequestType();
|
RequestType requestType = request->getRequestType();
|
||||||
map<string, string> bizModel = request->bizModel;
|
map<string, string> bizModel = request->bizModel;
|
||||||
// 创建HTTP请求客户端
|
// 创建HTTP请求客户端
|
||||||
httplib::Client cli(this->hostInfo.host, this->hostInfo.port);
|
// httplib::Client cli(this->hostInfo.host, this->hostInfo.port);
|
||||||
|
httplib::Client cli(this->url.c_str());
|
||||||
|
const char *url = this->url.c_str();
|
||||||
// 构建请求参数
|
// 构建请求参数
|
||||||
map<string, string> allParams = this->buildParams(request, token);
|
map<string, string> allParams = this->buildParams(request, token);
|
||||||
char *path = this->hostInfo.path;
|
|
||||||
string responseBody;
|
string responseBody;
|
||||||
// 如果有文件上传
|
// 如果有文件上传
|
||||||
if (!request->getFiles().empty()) {
|
if (!request->getFiles().empty()) {
|
||||||
httplib::MultipartFormDataItems items = OpenClient::getMultipartFormDataItems(
|
httplib::MultipartFormDataItems items = OpenClient::getMultipartFormDataItems(
|
||||||
allParams, request->getFiles());
|
allParams, request->getFiles());
|
||||||
responseBody = cli.Post(path, headers, items)->body;
|
responseBody = cli.Post(url, headers, items)->body;
|
||||||
} else {
|
} else {
|
||||||
switch (requestType) {
|
switch (requestType) {
|
||||||
case GET: {
|
case GET: {
|
||||||
responseBody = cli.Get(path, allParams, headers)->body;
|
string fullPath = this->url + "?" + OpenClient::getQuery(allParams);
|
||||||
|
responseBody = cli.Get(fullPath.c_str())->body;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case POST_FORM: {
|
case POST_FORM: {
|
||||||
responseBody = cli.Post(path, headers, OpenClient::getParams(allParams))->body;
|
responseBody = cli.Post(url, headers, OpenClient::getParams(allParams))->body;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case POST_JSON: {
|
case POST_JSON: {
|
||||||
string json = tool::mapToJson(allParams);
|
string json = tool::mapToJson(allParams);
|
||||||
responseBody = cli.Post(path, json, "application/json")->body;
|
responseBody = cli.Post(url, json, "application/json")->body;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case POST_FILE: {
|
case POST_FILE: {
|
||||||
httplib::MultipartFormDataItems items = OpenClient::getMultipartFormDataItems(
|
httplib::MultipartFormDataItems items = OpenClient::getMultipartFormDataItems(
|
||||||
allParams, request->getFiles());
|
allParams, request->getFiles());
|
||||||
responseBody = cli.Post(path, headers, items)->body;
|
responseBody = cli.Post(url, headers, items)->body;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,6 +73,19 @@ httplib::Params OpenClient::getParams(map<string, string> allParams) {
|
|||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string OpenClient::getQuery(map<string, string> allParams) {
|
||||||
|
string query;
|
||||||
|
map<string, string>::iterator it;
|
||||||
|
int i = 0;
|
||||||
|
for (it = allParams.begin(); it != allParams.end(); ++it) {
|
||||||
|
if (i++ > 0) {
|
||||||
|
query.append("&");
|
||||||
|
}
|
||||||
|
query.append(it->first).append("=").append(tool::url_encode(it->second));
|
||||||
|
}
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
map<string, string> OpenClient::buildParams(BaseRequest *request, const string &token) {
|
map<string, string> OpenClient::buildParams(BaseRequest *request, const string &token) {
|
||||||
map<string, string> allParams;
|
map<string, string> allParams;
|
||||||
allParams["app_id"] = this->appId;
|
allParams["app_id"] = this->appId;
|
||||||
@@ -90,15 +94,12 @@ map<string, string> OpenClient::buildParams(BaseRequest *request, const string &
|
|||||||
allParams["sign_type"] = "RSA2";
|
allParams["sign_type"] = "RSA2";
|
||||||
allParams["timestamp"] = tool::getTime();
|
allParams["timestamp"] = tool::getTime();
|
||||||
allParams["version"] = request->getVersion();
|
allParams["version"] = request->getVersion();
|
||||||
|
allParams["biz_content"] = tool::mapToJson(request->bizModel);
|
||||||
|
|
||||||
if (!token.empty()) {
|
if (!token.empty()) {
|
||||||
allParams["app_auth_token"] = token;
|
allParams["app_auth_token"] = token;
|
||||||
}
|
}
|
||||||
|
|
||||||
map<string, string> bizModel = request->bizModel;
|
|
||||||
|
|
||||||
allParams.insert(bizModel.begin(), bizModel.end());
|
|
||||||
|
|
||||||
// 生成签名
|
// 生成签名
|
||||||
string sign = signutil::createSign(allParams, this->privateKeyFilePath, "RSA2");
|
string sign = signutil::createSign(allParams, this->privateKeyFilePath, "RSA2");
|
||||||
allParams["sign"] = sign;
|
allParams["sign"] = sign;
|
||||||
@@ -121,13 +122,16 @@ OpenClient::getMultipartFormDataItems(map<string, string> allParams, vector<File
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
neb::CJsonObject OpenClient::parseResponse(const string& responseBody, BaseRequest *request) {
|
Json::Value OpenClient::parseResponse(const string& responseBody, BaseRequest *request) {
|
||||||
neb::CJsonObject oJson(responseBody);
|
Json::Value root;
|
||||||
neb::CJsonObject data = oJson[ERROR_NODE];
|
Json::Reader reader;
|
||||||
if (data.IsEmpty()) {
|
reader.parse(responseBody, root, false);
|
||||||
|
|
||||||
|
Json::Value data = root[ERROR_NODE];
|
||||||
|
if (!data) {
|
||||||
string method = request->getMethod();
|
string method = request->getMethod();
|
||||||
string nodeName = tool::replace(method.c_str(),".","_") + "_response";
|
string nodeName = tool::replace(method.c_str(),".","_") + "_response";
|
||||||
data = oJson[nodeName];
|
data = root[nodeName];
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@@ -2,18 +2,12 @@
|
|||||||
#define SDK_CXX_OPENCLIENT_H
|
#define SDK_CXX_OPENCLIENT_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <json/json.h>
|
||||||
#include "httplib.h"
|
#include "httplib.h"
|
||||||
#include "../request/BaseRequest.h"
|
#include "../request/BaseRequest.h"
|
||||||
#include "../thirdparty/CJsonObject/CJsonObject.hpp"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
struct HostInfo {
|
|
||||||
string host;
|
|
||||||
int port;
|
|
||||||
char *path;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求客户端
|
* 请求客户端
|
||||||
*/
|
*/
|
||||||
@@ -21,6 +15,7 @@ class OpenClient {
|
|||||||
private:
|
private:
|
||||||
/** 应用id */
|
/** 应用id */
|
||||||
string appId;
|
string appId;
|
||||||
|
string url;
|
||||||
/** 私钥文件路径 */
|
/** 私钥文件路径 */
|
||||||
string privateKeyFilePath;
|
string privateKeyFilePath;
|
||||||
|
|
||||||
@@ -39,19 +34,17 @@ public:
|
|||||||
* @param token token
|
* @param token token
|
||||||
* @return 返回响应结果
|
* @return 返回响应结果
|
||||||
*/
|
*/
|
||||||
neb::CJsonObject execute(BaseRequest *request, const string& token);
|
Json::Value execute(BaseRequest *request, const string& token);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送请求
|
* 发送请求
|
||||||
* @param request 请求对象,BaseRequest的子类
|
* @param request 请求对象,BaseRequest的子类
|
||||||
* @return 返回响应结果
|
* @return 返回响应结果
|
||||||
*/
|
*/
|
||||||
neb::CJsonObject execute(BaseRequest *request);
|
Json::Value execute(BaseRequest *request);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
HostInfo hostInfo;
|
|
||||||
|
|
||||||
map<string, string> buildParams(BaseRequest *request, const string& token);
|
map<string, string> buildParams(BaseRequest *request, const string& token);
|
||||||
|
|
||||||
static httplib::MultipartFormDataItems
|
static httplib::MultipartFormDataItems
|
||||||
@@ -59,7 +52,9 @@ private:
|
|||||||
|
|
||||||
static httplib::Params getParams(map<string, string> params);
|
static httplib::Params getParams(map<string, string> params);
|
||||||
|
|
||||||
static neb::CJsonObject parseResponse(const string& responseBody,BaseRequest *request);
|
static string getQuery(map<string, string> params);
|
||||||
|
|
||||||
|
static Json::Value parseResponse(const string& responseBody,BaseRequest *request);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
#include <clocale>
|
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
|
#include "json/json.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -21,49 +21,6 @@ namespace tool {
|
|||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_url(char *url, char **serverstrp, int *portp, char **pathstrp) {
|
|
||||||
char buf[256];
|
|
||||||
int serverlen, numread = 0;
|
|
||||||
/* go through the url */
|
|
||||||
|
|
||||||
/* reset url to point PAST the http:// */
|
|
||||||
|
|
||||||
/* assume it's always 7 chars! */
|
|
||||||
string _url = url;
|
|
||||||
bool isHttps = startWith(_url, "https");
|
|
||||||
int len = 7;
|
|
||||||
if (isHttps) {
|
|
||||||
len = 8;
|
|
||||||
}
|
|
||||||
url = url + len;
|
|
||||||
/* no http:// now... server is simply up to the next / or : */
|
|
||||||
|
|
||||||
sscanf(url, "%255[^/:]", buf);
|
|
||||||
serverlen = strlen(buf);
|
|
||||||
*serverstrp = (char *) malloc(serverlen + 1);
|
|
||||||
strcpy(*serverstrp, buf);
|
|
||||||
if (url[serverlen] == ':') {
|
|
||||||
/* get the port */
|
|
||||||
|
|
||||||
sscanf(&url[serverlen + 1], "%d%n", portp, &numread);
|
|
||||||
/* add one to go PAST it */
|
|
||||||
|
|
||||||
numread++;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (isHttps) {
|
|
||||||
*portp = 443;
|
|
||||||
} else {
|
|
||||||
*portp = 80;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/* the path is a pointer into the rest of url */
|
|
||||||
|
|
||||||
*pathstrp = &url[serverlen + numread];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string url_encode(const std::string &str) {
|
std::string url_encode(const std::string &str) {
|
||||||
std::string strTemp = "";
|
std::string strTemp = "";
|
||||||
size_t length = str.length();
|
size_t length = str.length();
|
||||||
@@ -75,7 +32,7 @@ namespace tool {
|
|||||||
(str[i] == '~'))
|
(str[i] == '~'))
|
||||||
strTemp += str[i];
|
strTemp += str[i];
|
||||||
else if (str[i] == ' ')
|
else if (str[i] == ' ')
|
||||||
strTemp += "+";
|
strTemp += "%20";
|
||||||
else {
|
else {
|
||||||
strTemp += '%';
|
strTemp += '%';
|
||||||
strTemp += ToHex((unsigned char) str[i] >> 4);
|
strTemp += ToHex((unsigned char) str[i] >> 4);
|
||||||
@@ -117,13 +74,12 @@ namespace tool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string mapToJson(std::map<string, string> map_info) {
|
string mapToJson(std::map<string, string> map_info) {
|
||||||
// Json::Value jObject;
|
Json::Value jObject;
|
||||||
// for (map<string, string>::const_iterator iter = map_info.begin( ); iter != map_info.end( ); ++iter)
|
for (map<string, string>::const_iterator iter = map_info.begin( ); iter != map_info.end( ); ++iter)
|
||||||
// {
|
{
|
||||||
// jObject[iter->first] = iter->second;
|
jObject[iter->first] = iter->second;
|
||||||
// }
|
}
|
||||||
// return jObject.toStyledString();
|
return jObject.toStyledString();
|
||||||
return "{}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string getFilename(string filepath) {
|
string getFilename(string filepath) {
|
||||||
|
@@ -16,8 +16,6 @@ namespace tool {
|
|||||||
|
|
||||||
string getTime();
|
string getTime();
|
||||||
|
|
||||||
int parse_url(char *url, char **serverstrp, int *portp, char **pathstrp);
|
|
||||||
|
|
||||||
std::string url_encode(const std::string &szToEncode);
|
std::string url_encode(const std::string &szToEncode);
|
||||||
|
|
||||||
std::string url_decode(const std::string &SRC);
|
std::string url_decode(const std::string &SRC);
|
||||||
|
@@ -5,11 +5,11 @@
|
|||||||
#include "request/MemberInfoGetRequest.hpp"
|
#include "request/MemberInfoGetRequest.hpp"
|
||||||
|
|
||||||
// 应用ID
|
// 应用ID
|
||||||
string appId = "2020051325943082302177280";
|
string appId = "201904035630907729292cpp";
|
||||||
// 存放私钥的文件路径
|
// 存放私钥的文件路径
|
||||||
string privateKeyFile = "/Users/thc/IdeaProjects/opc/opc-sdk/sdk-c++/privateEx.pem";
|
string privateKeyFile = "/Users/thc/IdeaProjects/SOP/sop-sdk/sdk-c++/privateEx.pem";
|
||||||
// 请求接口
|
// 请求接口
|
||||||
string url = "http://localhost:7071/prod/gw68uy85";
|
string url = "http://localhost:8081";
|
||||||
|
|
||||||
OpenClient openClient(appId, privateKeyFile, url);
|
OpenClient openClient(appId, privateKeyFile, url);
|
||||||
|
|
||||||
@@ -32,10 +32,11 @@ int main() {
|
|||||||
// });
|
// });
|
||||||
|
|
||||||
// 发送请求
|
// 发送请求
|
||||||
neb::CJsonObject jsonObj = openClient.execute(&request);
|
Json::Value jsonObj = openClient.execute(&request);
|
||||||
std::cout << jsonObj.ToString() << std::endl;
|
std::cout << jsonObj << std::endl;
|
||||||
std::cout << "id:" << jsonObj["id"].ToString() << std::endl;
|
std::cout << "id:" << jsonObj["id"].asString() << std::endl;
|
||||||
std::cout << "is_vip:" << jsonObj["member_info"]["is_vip"].ToString() << std::endl;
|
std::cout << "name:" << jsonObj["name"].asString() << std::endl;
|
||||||
|
std::cout << "is_vip:" << jsonObj["member_info"]["is_vip"].asString() << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
# SDK for C++
|
# SDK for C++
|
||||||
|
|
||||||
|
本工程使用`CLion`进行开发,前提安装jsoncpp(Mac安装方式:`brew install jsoncpp`)
|
||||||
|
|
||||||
使用方式见:main.cpp
|
使用方式见:main.cpp
|
3523
sop-sdk/sdk-c++/thirdparty/CJsonObject/CJsonObject.cpp
vendored
3523
sop-sdk/sdk-c++/thirdparty/CJsonObject/CJsonObject.cpp
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,156 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* Project: neb
|
|
||||||
* @file CJsonObject.hpp
|
|
||||||
* @brief Json
|
|
||||||
* @author bwarliao
|
|
||||||
* @date: 2014-7-16
|
|
||||||
* @note
|
|
||||||
* Modify history:
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef CJSONOBJECT_HPP_
|
|
||||||
#define CJSONOBJECT_HPP_
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <list>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include "cJSON.h"
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
namespace neb
|
|
||||||
{
|
|
||||||
|
|
||||||
class CJsonObject
|
|
||||||
{
|
|
||||||
public: // method of ordinary json object or json array
|
|
||||||
CJsonObject();
|
|
||||||
CJsonObject(const std::string& strJson);
|
|
||||||
CJsonObject(const CJsonObject* pJsonObject);
|
|
||||||
CJsonObject(const CJsonObject& oJsonObject);
|
|
||||||
virtual ~CJsonObject();
|
|
||||||
|
|
||||||
CJsonObject& operator=(const CJsonObject& oJsonObject);
|
|
||||||
bool operator==(const CJsonObject& oJsonObject) const;
|
|
||||||
bool Parse(const std::string& strJson);
|
|
||||||
void Clear();
|
|
||||||
bool IsEmpty() const;
|
|
||||||
bool IsArray() const;
|
|
||||||
std::string ToString() const;
|
|
||||||
std::string ToFormattedString() const;
|
|
||||||
const std::string& GetErrMsg() const
|
|
||||||
{
|
|
||||||
return(m_strErrMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public: // method of ordinary json object
|
|
||||||
bool AddEmptySubObject(const std::string& strKey);
|
|
||||||
bool AddEmptySubArray(const std::string& strKey);
|
|
||||||
bool GetKey(std::string& strKey);
|
|
||||||
void ResetTraversing();
|
|
||||||
CJsonObject& operator[](const std::string& strKey);
|
|
||||||
std::string operator()(const std::string& strKey) const;
|
|
||||||
bool Get(const std::string& strKey, CJsonObject& oJsonObject) const;
|
|
||||||
bool Get(const std::string& strKey, std::string& strValue) const;
|
|
||||||
bool Get(const std::string& strKey, int32& iValue) const;
|
|
||||||
bool Get(const std::string& strKey, uint32& uiValue) const;
|
|
||||||
bool Get(const std::string& strKey, int64& llValue) const;
|
|
||||||
bool Get(const std::string& strKey, uint64& ullValue) const;
|
|
||||||
bool Get(const std::string& strKey, bool& bValue) const;
|
|
||||||
bool Get(const std::string& strKey, float& fValue) const;
|
|
||||||
bool Get(const std::string& strKey, double& dValue) const;
|
|
||||||
bool IsNull(const std::string& strKey) const;
|
|
||||||
bool Add(const std::string& strKey, const CJsonObject& oJsonObject);
|
|
||||||
bool Add(const std::string& strKey, const std::string& strValue);
|
|
||||||
bool Add(const std::string& strKey, int32 iValue);
|
|
||||||
bool Add(const std::string& strKey, uint32 uiValue);
|
|
||||||
bool Add(const std::string& strKey, int64 llValue);
|
|
||||||
bool Add(const std::string& strKey, uint64 ullValue);
|
|
||||||
bool Add(const std::string& strKey, bool bValue, bool bValueAgain);
|
|
||||||
bool Add(const std::string& strKey, float fValue);
|
|
||||||
bool Add(const std::string& strKey, double dValue);
|
|
||||||
bool AddNull(const std::string& strKey); // add null like this: "key":null
|
|
||||||
bool Delete(const std::string& strKey);
|
|
||||||
bool Replace(const std::string& strKey, const CJsonObject& oJsonObject);
|
|
||||||
bool Replace(const std::string& strKey, const std::string& strValue);
|
|
||||||
bool Replace(const std::string& strKey, int32 iValue);
|
|
||||||
bool Replace(const std::string& strKey, uint32 uiValue);
|
|
||||||
bool Replace(const std::string& strKey, int64 llValue);
|
|
||||||
bool Replace(const std::string& strKey, uint64 ullValue);
|
|
||||||
bool Replace(const std::string& strKey, bool bValue, bool bValueAgain);
|
|
||||||
bool Replace(const std::string& strKey, float fValue);
|
|
||||||
bool Replace(const std::string& strKey, double dValue);
|
|
||||||
bool ReplaceWithNull(const std::string& strKey); // replace value with null
|
|
||||||
|
|
||||||
public: // method of json array
|
|
||||||
int GetArraySize();
|
|
||||||
CJsonObject& operator[](unsigned int uiWhich);
|
|
||||||
std::string operator()(unsigned int uiWhich) const;
|
|
||||||
bool Get(int iWhich, CJsonObject& oJsonObject) const;
|
|
||||||
bool Get(int iWhich, std::string& strValue) const;
|
|
||||||
bool Get(int iWhich, int32& iValue) const;
|
|
||||||
bool Get(int iWhich, uint32& uiValue) const;
|
|
||||||
bool Get(int iWhich, int64& llValue) const;
|
|
||||||
bool Get(int iWhich, uint64& ullValue) const;
|
|
||||||
bool Get(int iWhich, bool& bValue) const;
|
|
||||||
bool Get(int iWhich, float& fValue) const;
|
|
||||||
bool Get(int iWhich, double& dValue) const;
|
|
||||||
bool IsNull(int iWhich) const;
|
|
||||||
bool Add(const CJsonObject& oJsonObject);
|
|
||||||
bool Add(const std::string& strValue);
|
|
||||||
bool Add(int32 iValue);
|
|
||||||
bool Add(uint32 uiValue);
|
|
||||||
bool Add(int64 llValue);
|
|
||||||
bool Add(uint64 ullValue);
|
|
||||||
bool Add(int iAnywhere, bool bValue);
|
|
||||||
bool Add(float fValue);
|
|
||||||
bool Add(double dValue);
|
|
||||||
bool AddNull(); // add a null value
|
|
||||||
bool AddAsFirst(const CJsonObject& oJsonObject);
|
|
||||||
bool AddAsFirst(const std::string& strValue);
|
|
||||||
bool AddAsFirst(int32 iValue);
|
|
||||||
bool AddAsFirst(uint32 uiValue);
|
|
||||||
bool AddAsFirst(int64 llValue);
|
|
||||||
bool AddAsFirst(uint64 ullValue);
|
|
||||||
bool AddAsFirst(int iAnywhere, bool bValue);
|
|
||||||
bool AddAsFirst(float fValue);
|
|
||||||
bool AddAsFirst(double dValue);
|
|
||||||
bool AddNullAsFirst(); // add a null value
|
|
||||||
bool Delete(int iWhich);
|
|
||||||
bool Replace(int iWhich, const CJsonObject& oJsonObject);
|
|
||||||
bool Replace(int iWhich, const std::string& strValue);
|
|
||||||
bool Replace(int iWhich, int32 iValue);
|
|
||||||
bool Replace(int iWhich, uint32 uiValue);
|
|
||||||
bool Replace(int iWhich, int64 llValue);
|
|
||||||
bool Replace(int iWhich, uint64 ullValue);
|
|
||||||
bool Replace(int iWhich, bool bValue, bool bValueAgain);
|
|
||||||
bool Replace(int iWhich, float fValue);
|
|
||||||
bool Replace(int iWhich, double dValue);
|
|
||||||
bool ReplaceWithNull(int iWhich); // replace with a null value
|
|
||||||
|
|
||||||
private:
|
|
||||||
CJsonObject(cJSON* pJsonData);
|
|
||||||
|
|
||||||
private:
|
|
||||||
cJSON* m_pJsonData;
|
|
||||||
cJSON* m_pExternJsonDataRef;
|
|
||||||
cJSON* m_pKeyTravers;
|
|
||||||
std::string m_strErrMsg;
|
|
||||||
std::map<unsigned int, CJsonObject*> m_mapJsonArrayRef;
|
|
||||||
std::map<std::string, CJsonObject*> m_mapJsonObjectRef;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CJSONHELPER_HPP_ */
|
|
1091
sop-sdk/sdk-c++/thirdparty/CJsonObject/cJSON.c
vendored
1091
sop-sdk/sdk-c++/thirdparty/CJsonObject/cJSON.c
vendored
File diff suppressed because it is too large
Load Diff
151
sop-sdk/sdk-c++/thirdparty/CJsonObject/cJSON.h
vendored
151
sop-sdk/sdk-c++/thirdparty/CJsonObject/cJSON.h
vendored
@@ -1,151 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2009 Dave Gamble
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cJSON__h
|
|
||||||
#define cJSON__h
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef int int32;
|
|
||||||
typedef unsigned int uint32;
|
|
||||||
#ifndef _WIN32
|
|
||||||
#if __WORDSIZE == 64
|
|
||||||
typedef long int64;
|
|
||||||
typedef unsigned long uint64;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
typedef long long int64;
|
|
||||||
typedef unsigned long long uint64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* cJSON Types: */
|
|
||||||
#define cJSON_False 0
|
|
||||||
#define cJSON_True 1
|
|
||||||
#define cJSON_NULL 2
|
|
||||||
#define cJSON_Int 3
|
|
||||||
#define cJSON_Double 4
|
|
||||||
#define cJSON_String 5
|
|
||||||
#define cJSON_Array 6
|
|
||||||
#define cJSON_Object 7
|
|
||||||
|
|
||||||
#define cJSON_IsReference 256
|
|
||||||
|
|
||||||
/* The cJSON structure: */
|
|
||||||
typedef struct cJSON
|
|
||||||
{
|
|
||||||
struct cJSON *next, *prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
|
||||||
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
|
||||||
|
|
||||||
int type; /* The type of the item, as above. */
|
|
||||||
|
|
||||||
char *valuestring; /* The item's string, if type==cJSON_String */
|
|
||||||
int64 valueint; /* The item's number, if type==cJSON_Number */
|
|
||||||
double valuedouble; /* The item's number, if type==cJSON_Number */
|
|
||||||
int sign; /* sign of valueint, 1(unsigned), -1(signed) */
|
|
||||||
|
|
||||||
char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
|
||||||
} cJSON;
|
|
||||||
|
|
||||||
typedef struct cJSON_Hooks
|
|
||||||
{
|
|
||||||
void *(*malloc_fn)(size_t sz);
|
|
||||||
void (*free_fn)(void *ptr);
|
|
||||||
} cJSON_Hooks;
|
|
||||||
|
|
||||||
/* Supply malloc, realloc and free functions to cJSON */
|
|
||||||
extern void cJSON_InitHooks(cJSON_Hooks* hooks);
|
|
||||||
|
|
||||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
|
|
||||||
extern cJSON *cJSON_Parse(const char *value);
|
|
||||||
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
|
|
||||||
extern char *cJSON_Print(cJSON *item);
|
|
||||||
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
|
|
||||||
extern char *cJSON_PrintUnformatted(cJSON *item);
|
|
||||||
/* Delete a cJSON entity and all subentities. */
|
|
||||||
extern void cJSON_Delete(cJSON *c);
|
|
||||||
|
|
||||||
/* Returns the number of items in an array (or object). */
|
|
||||||
extern int cJSON_GetArraySize(cJSON *array);
|
|
||||||
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
|
|
||||||
extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
|
|
||||||
/* Get item "string" from object. Case insensitive. */
|
|
||||||
extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
|
|
||||||
|
|
||||||
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
|
||||||
extern const char *cJSON_GetErrorPtr();
|
|
||||||
|
|
||||||
/* These calls create a cJSON item of the appropriate type. */
|
|
||||||
extern cJSON *cJSON_CreateNull();
|
|
||||||
extern cJSON *cJSON_CreateTrue();
|
|
||||||
extern cJSON *cJSON_CreateFalse();
|
|
||||||
extern cJSON *cJSON_CreateBool(int b);
|
|
||||||
extern cJSON *cJSON_CreateDouble(double num, int sign);
|
|
||||||
extern cJSON *cJSON_CreateInt(uint64 num, int sign);
|
|
||||||
extern cJSON *cJSON_CreateString(const char *string);
|
|
||||||
extern cJSON *cJSON_CreateArray();
|
|
||||||
extern cJSON *cJSON_CreateObject();
|
|
||||||
|
|
||||||
/* These utilities create an Array of count items. */
|
|
||||||
extern cJSON *cJSON_CreateIntArray(int *numbers, int sign, int count);
|
|
||||||
extern cJSON *cJSON_CreateFloatArray(float *numbers, int count);
|
|
||||||
extern cJSON *cJSON_CreateDoubleArray(double *numbers, int count);
|
|
||||||
extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
|
|
||||||
|
|
||||||
/* Append item to the specified array/object. */
|
|
||||||
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
|
||||||
extern void cJSON_AddItemToArrayHead(cJSON *array, cJSON *item); /* add by Bwar on 2015-01-28 */
|
|
||||||
extern void cJSON_AddItemToObject(cJSON *object, const char *string,
|
|
||||||
cJSON *item);
|
|
||||||
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
|
||||||
extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
|
||||||
extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string,
|
|
||||||
cJSON *item);
|
|
||||||
|
|
||||||
/* Remove/Detatch items from Arrays/Objects. */
|
|
||||||
extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
|
|
||||||
extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
|
|
||||||
extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
|
||||||
extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
|
||||||
|
|
||||||
/* Update array items. */
|
|
||||||
extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
|
||||||
extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string,
|
|
||||||
cJSON *newitem);
|
|
||||||
|
|
||||||
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
|
|
||||||
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
|
|
||||||
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
|
|
||||||
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
|
|
||||||
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
Reference in New Issue
Block a user