poco-http server in MFC

使用 vs2015 静态编译的库,简单的使用样例. Poco 1.9


// =============================================== json
// 这个定义暂时好像没用。是在样例程序里面看到的。
//#define POCO_STATIC

#include <Poco/JSON/JSON.h>
#include "Poco/JSON/JSONException.h"
#include "Poco/JSON/Parser.h"

using Poco::JSON::Object;
using Poco::JSON::Array;

// =================================================
// need this library for GetAdaptersInfo in void EnvironmentImpl::nodeIdImpl(NodeId& id)
#pragma comment(lib,"Iphlpapi.lib")
// use poco in MFC should include this header file
#include <winsvc.h>

#include <Poco/Net/HTTPServer.h>
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/StreamCopier.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/Timestamp.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include "Poco/Exception.h"
#include "Poco/ThreadPool.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include <Poco/Net/NetException.h>
#include <iostream>

using Poco::Net::ServerSocket;
using Poco::Net::HTTPRequestHandler;
using Poco::Net::HTTPRequestHandlerFactory;
using Poco::Net::HTTPServer;
using Poco::Net::HTTPServerRequest;
using Poco::Net::HTTPServerResponse;
using Poco::Net::HTTPServerParams;
using Poco::StreamCopier;
using Poco::Net::HTMLForm;
using Poco::Timestamp;
using Poco::DateTimeFormatter;
using Poco::DateTimeFormat;
using Poco::ThreadPool;
using Poco::Util::ServerApplication;
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::OptionCallback;
using Poco::Util::HelpFormatter;

#pragma comment(lib, "PocoFoundationmtd.lib")
#pragma comment(lib, "PocoNetmtd.lib")
#pragma comment(lib, "PocoUtilmtd.lib")
#pragma comment(lib, "PocoJSONmtd.lib")
#pragma comment(lib, "PocoXMLmtd.lib")
#pragma comment(lib, "PocoEncodingsmtd.lib")


//=============================== http server

shared_ptr<Poco::Net::HTTPServer> m_pHttp;


class TimeRequestHandler : public HTTPRequestHandler
{
public:
TimeRequestHandler(const std::string& format) : _format(format)
{
}

void handleRequest(HTTPServerRequest& request,
HTTPServerResponse& response)
{
string method = request.getMethod();
string url = request.getContentType();
std::streamsize paramLen = request.getContentLength();

string jsonParam;
Poco::StreamCopier::copyToString(request.stream(), jsonParam);

response.setChunkedTransferEncoding(true);
response.setContentType("application/json");
response.setContentLength(strResp.size()); // 这个很重要,否则会有收不到响应信息的情况
std::ostream& ostr = response.send();
ostr << "{}";
}

private:
std::string _format;
};

class TimeRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
TimeRequestHandlerFactory(const std::string& format) :
_format(format)
{
}

HTTPRequestHandler* createRequestHandler(
const HTTPServerRequest& request)
{
if (request.getURI() == "/")
return new TimeRequestHandler(_format);
else if (request.getURI() == "/api/v1.0/devEF01")
return new TimeRequestHandler(_format);
else
return 0;
}

private:
std::string _format;
};



void CpocoStudyDlg::OnBnClickedBtnStartHttpserver()
{

Poco::Net::initializeNetwork();
HTTPServerParams::Ptr pParams(new HTTPServerParams());
pParams->setKeepAlive(false);
m_pHttp = make_shared<HTTPServer>(new TimeRequestHandlerFactory("yy"), 61000, pParams);
m_pHttp->start();
OutputDebugStringA("ss");
}


void CpocoStudyDlg::OnBnClickedBtnStopHttpserver()
{
try
{
m_pHttp->stop();
m_pHttp->stopAll(true);
m_pHttp.reset();
Poco::Net::uninitializeNetwork();
}
catch (const Poco::Net::NetException& e)
{
string strLog = e.displayText();
std::cerr << strLog << std::endl;
} catch (...)
{
ASSERT(FALSE);
}
}