bookmark_border一个使用Poco::http库封装的c++ http调用类

头文件webapi.h

#pragma once
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/HTMLForm.h>
#include <Poco/URI.h>
#include <Poco/NumberParser.h>
#include <Poco/String.h>
#include <atomic>
#include <string>

using namespace std;

class CWebApi
{
public:
	CWebApi(string baseUrl = "");
	~CWebApi();

	void setBaseUrl(const string& baseUrl);
	string getBaseUrl();
	bool httpGet(string api, string& resp, int32_t& status, string& errmsg);

private:
	string baseUrl_;
};

源文件webapi.cpp

#include "webapi.h"
#include <iostream>
#include "log.h"

CWebApi::CWebApi(string baseUrl)
	:baseUrl_(baseUrl)
{

}

CWebApi::~CWebApi()
{

}

void CWebApi::setBaseUrl(const string& baseUrl)
{
	baseUrl_ = baseUrl;
}

string CWebApi::getBaseUrl()
{
	return baseUrl_;
}

bool CWebApi::httpGet(string api, string& resp, int32_t& status, string& errmsg)
{
	LOG_INFO("BEGIN {}", api);

	bool ret = false;
	string strUrl;
	
	strUrl = baseUrl_ + api;

	try {

		Poco::URI httpUrl(strUrl);
		Poco::Net::HTTPClientSession session(httpUrl.getHost(), httpUrl.getPort());
		session.setTimeout(Poco::Timespan(8, 0), Poco::Timespan(8, 0), Poco::Timespan(8, 0));
		Poco::Net::HTTPRequest httpReq(Poco::Net::HTTPRequest::HTTP_GET, httpUrl.getPathAndQuery());
				
		httpReq.add("Connection", "close");
		session.sendRequest(httpReq);

		Poco::Net::HTTPResponse httpResp;
		istream& is = session.receiveResponse(httpResp);
		Poco::StreamCopier::copyToString(is, resp);
		status = httpResp.getStatus();

		if (status == Poco::Net::HTTPResponse::HTTP_NOT_MODIFIED) 
		{
			LOG_DEBUG("WebAPI {}, configuration not modified!", strUrl);
		}

		if (status == Poco::Net::HTTPResponse::HTTP_OK
			|| status == Poco::Net::HTTPResponse::HTTP_NOT_MODIFIED)
		{

			ret = true;
		}
		else
		{

		}

		session.reset();
	}
	catch (Poco::Net::NetException & ex) 
	{
		errmsg = ex.displayText();
	}
	catch (std::exception& exc) 
	{
		errmsg = exc.what();
	}
	catch (...) {

	}

	if (!ret)
	{
		LOG_ERROR("WebAPI {} error, status = {}, errmsg = {}", strUrl, status, errmsg);
	}
	LOG_INFO("END {}", api);

	return ret;
}

bookmark_borderPoco C++库简介 (转)

学习一个框架前,要先明白它的是什么,为什么,怎么用.下面这些文字,是从中文poco官网上转过来的,正如poco c++库的特点,非常清晰,代码风格更是一目了然.

   poco开发库的特点,非常适合写后台处理程序,效率也是很高的.前台界面程序使用Qt框架库,非常好,两个库相辅相成,可解决项目上的大部分问题.

注:更多详情可以访问Poco官方网站:https://pocoproject.org

Poco C++库是:

  • 一系列C++类库,类似Java类库,.Net框架,Apple的Cocoa;

  • 侧重于互联网时代的网络应用程序

  • 使用高效的,现代的标准ANSI/ISO C++,并基于STL

  • 高可移值性,并可在多个平台下可用

  • 开源,并使用Boost Software License发布

  • 不管是否商用,都完全免费

特性:

  • DynamicAny与Any类

  • Cache框架

  • 基于OpenSSL的密码系统

  • 日期,时间类库

  • 事件和通知框架

  • FTP客户端

  • 跨平台的文件系统类库

  • HTML表单类库

  • HTTP客户端和服务端(支持SSL),C++ 服务器页面编译器

  • 日志框架

  • 多线程框架(线程池,活动对象,工作队列等)

  • POP3客户端类库

  • 跨平台,一次编写,多平台编译和运行

  • 进程管理和进程间通信类库

  • 反射框架

  • 基于PCRE的正则表达式

  • SMTP客户端类库

  • 数据库访问类库(SQLite,MySQL, ODBC)

  • 支持SSL/TLS,基于OpenSSL

  • 动态类库加载

  • 先进的内存和指针管理(Buffer, Pool)

  • Socket类库

  • 网络数据流类库,支持Base64,HexBinary编解码,压缩等等

  • 字符串格式化和其它字符串工具类库

  • TCP服务器框架(多线程)

  • 文本编码和转换

  • Tuples

  • URI支持

  • 支持UTF8和Unicode编码

  • UUID生成器

  • XML生成和解析器

  • Zip文件操作类库

Poco的使命

  • Poco是一个强大的类库,并易于构建自己的应用程序

  • Poco帮助你创建跨平台的应用程序(一次编写,多平台编译和运行)

  • 模块化和可扩展,可应用于嵌入式到企业级程序

  • 提供全面,易懂的编程接口

  • 使用C++语言,快速且高效

  • Poco崇尚简易

  • 在设计,代码风格和文档上保持一致

  • Poco强调代码质量,包括可读性,综合性,一致性,编码风格和可测试性

  • Poco使得C++编程更加容易

指导方针

  • 高度关注代码质量,编码风格,一致性,可读性

  • 高度关注测试

  • 注重实用性

  • 基于现有的,可靠的组件开发

版本历史

  • Summer 2004: Günter Obiltschnig started development

  • February 2005: First release on SourceForge

  • (Release 0.91 under Sleepycat license)

  • May 2005: First contributions by Aleksandar Fabijanic

  • January 2006: Release 1.0

  • March 2006: Release 1.1

  • July 2006: Moved to Boost license, POCO Community Website

  • August 2006: Release 1.2

  • May 2007: Release 1.3

  • July 2010: Stable Release 1.3.7,

  • about 20 contributors, used in 100s of projects

支持平台

  • Microsoft Windows

  • Linux

  • Mac OS X

  • HP-UX, Solaris, AIX*

  • Embedded Linux (uClibc, glibc)

  • iOS

  • Windows Embedded CE

  • QNX

Poco应用场景

  • 创建自动化的中间件和设备

  • 工业自动化和工业设备

  • 流量控制系统

  • 健康系统

  • 测量,数据收集和测试系统

  • 消费电子产品和家庭自动化产品

  • 测量

  • 航空交通管理系统

  • VoIP

  • 票务和入口控制系统

  • 包装应用程序

Poco的优势

  • 全面的,完整的C++框架,可减少开发工作,快速让产品走向市场

  • 易学易使用,以及相当多的示例代码和良好的文档

  • 原生的C++代码,性能优秀,低内存占用

  • 平台无关,一处编写,跨平台编译和运行

    • 大多数情况下,可以开发机上完成开发和调试工作

    • 可以非常容易的迁移到新平台

       

 

设计 & 实现

   基于现代的、标准的ANSI C++编写,使用C++ STL库。模块化设计,极少的外部依赖,易于编译和使用。结合传统的面向对象与现代的C++设计,代码易读,代码风格统一,以及相当全面的测试用例。

支持平台

  • 桌面/服务器: Windows, Linux, Mac OS X, Solaris, HP-UX, AIX

  • 嵌入式系统: Windows Embedded CE, Embedded Linux (uClibc or glibc), iOS, QNX, VxWorks, Android

  • 最低系统要求: 75 MHz ARM9, 8 MB RAM (Embedded Linux).

License

  • Boost Software License 1.0

核心特性

  • 支持Any 和 DynamicAny 的动态类型

  • 提供缓存框架

  • 日期和时间

  • 事件与通知框架

  • (libPoco.com翻译,转载请注明)

  • 基于PCRE的正则表达式

  • 动态库加载

  • 完美的指针和内存管理 (buffer, pool)

  • 字符串格式化和工具

  • tuples

压缩

  • 基于zlib的压缩/解压类

  • 创建和解压ZIP文件

加密

  • 支持多种hash算法

  • 支持X509数字证书

  • 对称的和 RSA算法

  • 支持streams加解密

  • 基于OpenSSL

数据库

  • 不同的数据库提供了统一的访问接口(SQLite, MySQL, ODBC)

  • 自动数据类型匹配

  • 支持集合类 (std::vector, std::set, std::map, etc.)

  • 支持记录集和tuples

  • 支持连接池

文件系统

  • 跨平台的文件路径操作

  • 目录列表

  • 通配符支持

  • 文件属性管理

日志

  • 可扩展的日志框架,可拔插的日志通道和消息格式化

  • 日志可输出到终端,日志文件,syslog,远程syslog,Windows事件服务

多线程

  • 线程和线程同步类库

  • 线程池

  • 工作队列

  • 活动对象

  • 任务管理

  • 定时器

网络

  • 流,数据报,多播,服务器和原生socket.

  • TCP服务器框架(多线程)

  • 反射服务器框架

  • HTTP(S)客户和服务器框架

  • HTTP认证

  • CSP(C++ Server Page)编译器

  • FTP客户端

  • SMTP和POP3客户端

  • (libPoco.com翻译,转载请注明)

  • 支持URI, UUID

  • HTML表单处理

  • MIME支持

  • 基于 OpenSSL支持SSL/TLS

  • WebSocket (RFC 6455) 客户和服务器

进程管理和 IPC

  • 进程启停

  • 进程间同步

  • 共享内存

  • Base64 和 HexBinary 编解码

  • 压缩(zlib)

  • 行结束符车换

  • 内存stream

  • 文本编码转换

  • URI流读取

文本编码

  • 支持UTF-8 和 Unicode

  • 文本编码和转换

  • 字符分类

工具类

  • 支持命令行和服务器程序框架

  • 命令行参数解析器

  • 配置文件解析

  • 支持Unix和Windows后台服务

XML

  • 基于 Expat 的XML解析

  • SAX2 (Simple API for XML, version 2) 解析器

  • DOM (Document Object Model, Level 1-3) 解析器

  • XML生成器