RestfulFunc.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #ifndef _OTHER_RESFULFUNCEXPORT_HEADER_
  2. #define _OTHER_RESFULFUNCEXPORT_HEADER_
  3. #pragma once
  4. #ifdef _WIN32
  5. #ifdef RESTFULPUBLIC_EXPORTS
  6. #ifndef RESTFULFUNC_API
  7. #define RESTFULFUNC_API __declspec(dllexport)
  8. #endif
  9. #else
  10. #ifndef RESTFULFUNC_API
  11. #define RESTFULFUNC_API __declspec(dllimport)
  12. #endif
  13. #endif
  14. #else
  15. #if ( defined(__GNUC__) && __GNUC__ >= 4 )
  16. #define RESTFULFUNC_API __attribute__((visibility("default")))
  17. #else
  18. #define RESTFULFUNC_API
  19. #endif
  20. #endif
  21. #include <iostream>
  22. #include <string>
  23. #include <map>
  24. #include <vector>
  25. /*
  26. * > 0 : 网站返回的错误码,比如 200,404 等
  27. * -1:未归类,具体错误信息见 out_msg 返回的内容
  28. * -2:超时
  29. * -3:地址不符合规范
  30. */
  31. RESTFULFUNC_API int HttpProbe(const std::string& url, std::string& out_msg, uint32_t wait_max_secs = (uint32_t)-1);
  32. /*!
  33. * @brief Ping protocols
  34. * @param[in]
  35. * @param[out]
  36. * @return : 0: ping connect succ; 1: ping failed
  37. */
  38. RESTFULFUNC_API int PingTest(const std::string& dst_ip);
  39. RESTFULFUNC_API int SocketConnectTest(const std::string& addrIP, int nPort, std::string& out_msg);
  40. enum HttpRequestMethod
  41. {
  42. GET,
  43. POST,
  44. PUT,
  45. DEL,
  46. HEAD,
  47. OPTIONS,
  48. TRCE,
  49. CONNECT,
  50. MERGE,
  51. PATCH,
  52. UPLOAD,
  53. DOWNLOAD
  54. };
  55. enum HttpStatusCode : int
  56. {
  57. Continue = 100,
  58. SwitchingProtocols = 101,
  59. OK = 200,
  60. Created = 201,
  61. Accepted = 202,
  62. NonAuthInfo = 203,
  63. NoContent = 204,
  64. ResetContent = 205,
  65. PartialContent = 206,
  66. MultiStatus = 207,
  67. AlreadyReported = 208,
  68. MultipleChoices = 300,
  69. MovedPermanently = 301,
  70. Found = 302,
  71. SeeOther = 303,
  72. NotModified = 304,
  73. UseProxy = 305,
  74. Forbidden = 403,
  75. NotFound = 404,
  76. ServiceUnavailable = 503
  77. };
  78. struct HttpClientResponseResult
  79. {
  80. int statusCode;
  81. std::string content;
  82. HttpClientResponseResult() :statusCode(HttpStatusCode::NotFound), content("") {}
  83. /** 子类继承实现 */
  84. virtual bool ConsiderAsSucc() const
  85. {
  86. return (statusCode == HttpStatusCode::OK);
  87. }
  88. };
  89. struct HttpClientRequestConfig
  90. {
  91. /*!
  92. * @brief
  93. * @param[in] uri: 必须以 "http://" 或 "https://" 开头
  94. * @param[out]
  95. * @return :
  96. */
  97. HttpClientRequestConfig(const std::string& uri)
  98. :mMethod(HttpRequestMethod::GET), mUri(uri), mToValidCert(false)
  99. , mBodyContent(""), mContentType(""), mHeaderAcceptType("application/json"), mTimeoutSecs(0)
  100. {
  101. }
  102. HttpClientRequestConfig(HttpRequestMethod method)
  103. : mMethod(method), mToValidCert(false), mBodyContent(""), mHeaderAcceptType("application/json")
  104. , mContentType(""), mTimeoutSecs(0)
  105. {
  106. }
  107. HttpClientRequestConfig(HttpRequestMethod method, const std::string& uri)
  108. :mMethod(method), mUri(uri), mToValidCert(false), mBodyContent("")
  109. , mContentType(""), mHeaderAcceptType("application/json"), mTimeoutSecs(0)
  110. {
  111. }
  112. void SetRequestType(HttpRequestMethod method) { mMethod = method; }
  113. HttpRequestMethod GetRequestType() const { return mMethod; }
  114. // uri: 必须以 "http://" 或 "https://" 开头
  115. void SetUri(const std::string& uri) { mUri = uri; }
  116. void SetChildUri(const std::string& subUri) { mSubUri = subUri; }
  117. void AppendQuery(const std::string& name, const std::string& value) {
  118. mQueryPairs[name] = value;
  119. }
  120. std::string GetBaseUri() const { return mUri; }
  121. std::string GetSubUri() const { return mSubUri; }
  122. std::string GetRequestUri() const { return mUri + mSubUri; }
  123. void ResetQuery() { mQueryPairs.clear(); }
  124. const std::map<std::string, std::string>& GetQueryPairs() const { return mQueryPairs; }
  125. std::string GetAcceptType() const { return mHeaderAcceptType; }
  126. void SetAcceptType(const std::string& value) {
  127. mHeaderAcceptType = value;
  128. }
  129. bool NeedValidCert() const { return mToValidCert; }
  130. void SetJsonBody(const std::string& value) {
  131. SetBodyContent(value, "application/json");
  132. }
  133. void SetBodyContent(const std::string& value, const std::string& type) {
  134. mBodyContent = value;
  135. mContentType = type;
  136. }
  137. virtual std::string GetBodyContent() const { return mBodyContent; }
  138. virtual std::string GetContentType() const { return mContentType; }
  139. void SetTimeout(uint32_t timeoutSecs) { mTimeoutSecs = timeoutSecs; }
  140. uint32_t GetTimeout() const { return mTimeoutSecs; }
  141. virtual void PreDo() {}
  142. virtual void PostDo() {}
  143. private:
  144. HttpRequestMethod mMethod;
  145. std::string mUri;
  146. std::string mSubUri;
  147. std::string mBodyContent;
  148. std::string mContentType;
  149. std::string mHeaderAcceptType;
  150. std::map<std::string, std::string> mQueryPairs;
  151. bool mToValidCert;
  152. uint32_t mTimeoutSecs;
  153. };
  154. struct HttpClientPostTypeRequest : public HttpClientRequestConfig
  155. {
  156. HttpClientPostTypeRequest(const std::string& uri)
  157. :HttpClientRequestConfig(HttpRequestMethod::POST, uri) {}
  158. };
  159. struct HttpClientUploadRequest : public HttpClientRequestConfig
  160. {
  161. HttpClientUploadRequest(const std::string& uri)
  162. :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri)
  163. {
  164. }
  165. void ClearPararm() { mParams.clear(); }
  166. void AddParams(const std::string& name, const std::string& value)
  167. {
  168. mParams.push_back(std::move(std::pair<std::string, std::string>(name, value)));
  169. }
  170. void SetDefaultParam(const std::string& value)
  171. {
  172. AddParams("params", value);
  173. }
  174. void ClearFiles() { mFiles.clear(); }
  175. void AddFiles(const std::string& filePath)
  176. {
  177. mFiles.push_back(std::move(std::pair<std::string, std::string>("file_content", filePath)));
  178. }
  179. virtual void PreDo()
  180. {
  181. auto p = BuildBodyContent();
  182. std::cout << p.second << std::endl;
  183. SetBodyContent(p.second, std::string("multipart/form-data; boundary=") + p.first);
  184. }
  185. std::pair<std::string, std::string> BuildBodyContent() const;
  186. private:
  187. std::vector<std::pair<std::string, std::string> > mParams;
  188. std::vector<std::pair<std::string, std::string> > mFiles;
  189. };
  190. struct HttpClientDownloadRequest : public HttpClientRequestConfig
  191. {
  192. HttpClientDownloadRequest(const std::string& uri)
  193. :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri) {
  194. SetAcceptType("*/*");
  195. }
  196. };
  197. class RESTFULFUNC_API RestfulClient
  198. {
  199. public:
  200. static RestfulClient& getInstance(); // Singleton
  201. ~RestfulClient();
  202. void Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse) const;
  203. private:
  204. RestfulClient();
  205. private:
  206. };
  207. #endif //_OTHER_RESFULFUNCEXPORT_HEADER_