#include #include #include #include #include #include namespace TMDb { class HttpClient { public: class ParameterValue { public: ParameterValue(const std::string & v) : value(v) { } template ParameterValue(const V & v) : value(boost::lexical_cast(v)) { } template ParameterValue(const IceUtil::Optional & v) : value(v ? boost::lexical_cast(*v) : IceUtil::Optional()) { } IceUtil::Optional value; }; typedef std::map Parameters; protected: HttpClient(const std::string & baseUrl, const std::string & apikey); template std::string GetUrl(const std::string & pathFormat, const Params & ... params, const Parameters & parameters) const { boost::format path(pathFormat); packParams(path, params...); std::string pathStr(path.str()); appendQueryParameters(pathStr, parameters); return BaseURL + pathStr; } template IceInternal::Handle GetData(const std::string & pathFormat, const Params & ... params, const Parameters & parameters) const { json::Value data = FetchJson(GetUrl(pathFormat, params..., parameters)); return Slicer::Deserialize(data); } static void packParams(boost::format &); template static void packParams(boost::format & fmt, const T & param, const Ts & ... params) { fmt % param; packParams(fmt, params...); } void appendQueryParameters(std::string & path, const Parameters & parameters) const; void appendQueryParameters(std::string & path, const Parameters::value_type & nvp) const; json::Value FetchJson(const std::string & path) const; const std::string BaseURL; const std::string ApiKey; }; };