tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse)

2024-02-06 11:08

本文主要是介绍tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     最近要开发一个需求, 涉及到http参数的处理, 我居然还自己去写string到map和map到string的转换, 当看到tc_parsepara后, 深感痛心, 原来, tars的基础库早就实现了这些功能, 来看一下:

/*** Tencent is pleased to support the open source community by making Tars available.** Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.** Licensed under the BSD 3-Clause License (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at** https://opensource.org/licenses/BSD-3-Clause** Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License.*/#include "util/tc_parsepara.h"namespace tars
{#define ENCODE_TABLE "=&%\r\n"TC_Parsepara::TC_Parsepara(const string &sParam)
{load(sParam);
}TC_Parsepara::TC_Parsepara(const map<string, string> &mpParam)
{load(mpParam);
}TC_Parsepara::TC_Parsepara(const TC_Parsepara ¶)
{_param = para._param;
}TC_Parsepara &TC_Parsepara::operator=(const TC_Parsepara ¶)
{if(this != ¶){clear();_param = para._param;}return *this;
}bool TC_Parsepara::operator==(const TC_Parsepara ¶)
{return _param == para._param;
}const TC_Parsepara TC_Parsepara::operator+(const TC_Parsepara ¶)
{map<string, string> mpParam;mpParam = _param;mpParam.insert(para._param.begin(), para._param.end());return TC_Parsepara(mpParam);
}TC_Parsepara& TC_Parsepara::operator+=(const TC_Parsepara ¶)
{_param.insert(para._param.begin(), para._param.end());return *this;
}TC_Parsepara::~TC_Parsepara()
{clear();
}void TC_Parsepara::clear()
{_param.clear();
}string TC_Parsepara::encodeMap(const map<string, string> &mpParam) const
{string sParsepara("");map<string, string>::const_iterator it = mpParam.begin();while(it != mpParam.end()){sParsepara += encodestr((*it).first) + "=" + encodestr((*it).second);it++;if(it != mpParam.end()){sParsepara += "&";}}return sParsepara;
}void TC_Parsepara::decodeMap(const string &sParam, map<string, string> &mpParam) const
{int iFlag = 0;char ch1 = '=';char ch2 = '&';string sName;string sValue;string sBuffer;if (sParam.length() == 0){mpParam.clear();return ;}string::size_type pos = 0;while( pos <= sParam.length()){if(sParam[pos] == ch1)                                    //中间分隔符,前面读入是name{sName = decodestr(sBuffer);sBuffer = "";iFlag = 1;}else if(sParam[pos] == ch2 || pos == sParam.length())    //结束符,读入的是值{sValue = decodestr(sBuffer);sBuffer = "";if(sName.length() > 0 && iFlag){mpParam[sName] = decodestr(sValue);iFlag = 0;}}else{sBuffer += sParam[pos];}pos++;}
}void TC_Parsepara::load(const string &sParam)
{clear();decodeMap(sParam, _param);
}void TC_Parsepara::load(const map<string, string> &mpParam)
{_param = mpParam;
}string TC_Parsepara::tostr() const
{return encodeMap(_param);
}string &TC_Parsepara::operator[](const string &sName)
{return _param[sName];
}string TC_Parsepara::getValue(const string &sName) const
{string sValue;map<string, string>::const_iterator it;if((it = _param.find(sName)) != _param.end()){sValue = it->second;}return sValue;
}void TC_Parsepara::setValue(const string &sName, const string &sValue)
{_param[sName] = sValue;
}map<string,string> &TC_Parsepara::toMap()
{return _param;
}const map<string,string> &TC_Parsepara::toMap() const
{return _param;
}void TC_Parsepara::traverse(TC_ParseparaTraverseFunc func,void *pParam)
{map<string, string>::iterator it  = _param.begin();map<string, string>::iterator itEnd  = _param.end();while(it != itEnd){func(it->first, it->second, pParam);++it;}
}char TC_Parsepara::x2c(const string &sWhat)
{register char digit;if(sWhat.length() < 2){return '\0';}digit = (sWhat[0] >= 'A' ? ((sWhat[0] & 0xdf) - 'A')+10 : (sWhat[0] - '0'));digit *= 16;digit += (sWhat[1] >= 'A' ? ((sWhat[1] & 0xdf) - 'A')+10 : (sWhat[1] - '0'));return(digit);
}string TC_Parsepara::decodestr(const string &sParam)
{string sBuffer("");string::size_type pos = 0;while( pos < sParam.length()){if(sParam[pos] == '%'){if (pos >= sParam.length() - 2){break;}sBuffer += x2c(sParam.substr(pos + 1));pos += 3;}else{sBuffer += sParam[pos];pos++;}}return sBuffer;
}string TC_Parsepara::encodestr(const string &sParam)
{string sBuffer("");static char sHexTable[17] = "0123456789ABCDEF";string::size_type pos = 0;while( pos < sParam.length()){if(string(ENCODE_TABLE).find_first_of(sParam[pos]) != string::npos){sBuffer += '%';sBuffer += sHexTable[(sParam[pos]>>4)&0x0f];sBuffer += sHexTable[sParam[pos]&0x0f];}else{sBuffer += sParam[pos];}pos++;}return sBuffer;
}}

        简单测试玩了一下, 非常好用。 上述类中函数相当简单, 一看就懂, 无非就是字符串的变换而已, 不需要多说。

 

 

这篇关于tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684121

相关文章

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一