1
0

requests.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef HV_REQUESTS_H_
  2. #define HV_REQUESTS_H_
  3. /*
  4. * Inspired by python requests
  5. *
  6. * @code
  7. #include "requests.h"
  8. int main() {
  9. auto resp = requests::get("http://127.0.0.1:8080/ping");
  10. if (resp == NULL) {
  11. printf("request failed!\n");
  12. } else {
  13. printf("%d %s\r\n", resp->status_code, resp->status_message());
  14. printf("%s\n", resp->body.c_str());
  15. }
  16. resp = requests::post("http://127.0.0.1:8080/echo", "hello,world!");
  17. if (resp == NULL) {
  18. printf("request failed!\n");
  19. } else {
  20. printf("%d %s\r\n", resp->status_code, resp->status_message());
  21. printf("%s\n", resp->body.c_str());
  22. }
  23. return 0;
  24. }
  25. **/
  26. #include <memory>
  27. #include "http_client.h"
  28. namespace requests {
  29. typedef HttpRequestPtr Request;
  30. typedef HttpResponsePtr Response;
  31. typedef HttpResponseCallback ResponseCallback;
  32. static http_headers DefaultHeaders;
  33. static http_body NoBody;
  34. HV_INLINE Response request(Request req) {
  35. Response resp(new HttpResponse);
  36. int ret = http_client_send(req.get(), resp.get());
  37. return ret ? NULL : resp;
  38. }
  39. HV_INLINE Response request(http_method method, const char* url, const http_body& body = NoBody, const http_headers& headers = DefaultHeaders) {
  40. Request req(new HttpRequest);
  41. req->method = method;
  42. req->url = url;
  43. if (&body != &NoBody) {
  44. req->body = body;
  45. }
  46. if (&headers != &DefaultHeaders) {
  47. req->headers = headers;
  48. }
  49. return request(req);
  50. }
  51. HV_INLINE Response uploadFile(http_method method, const char* url, const char* filepath, const http_headers& headers = DefaultHeaders) {
  52. Request req(new HttpRequest);
  53. req->method = method;
  54. req->url = url;
  55. if (req->File(filepath) != 200) return NULL;
  56. if (&headers != &DefaultHeaders) {
  57. req->headers = headers;
  58. }
  59. return request(req);
  60. }
  61. #ifndef WITHOUT_HTTP_CONTENT
  62. HV_INLINE Response uploadFormFile(http_method method, const char* url, const char* name, const char* filepath, const http_headers& headers = DefaultHeaders) {
  63. Request req(new HttpRequest);
  64. req->method = method;
  65. req->url = url;
  66. req->FormFile(name, filepath);
  67. if (&headers != &DefaultHeaders) {
  68. req->headers = headers;
  69. }
  70. return request(req);
  71. }
  72. #endif
  73. HV_INLINE Response head(const char* url, const http_headers& headers = DefaultHeaders) {
  74. return request(HTTP_HEAD, url, NoBody, headers);
  75. }
  76. HV_INLINE Response get(const char* url, const http_headers& headers = DefaultHeaders) {
  77. return request(HTTP_GET, url, NoBody, headers);
  78. }
  79. HV_INLINE Response post(const char* url, const http_body& body = NoBody, const http_headers& headers = DefaultHeaders) {
  80. return request(HTTP_POST, url, body, headers);
  81. }
  82. HV_INLINE Response put(const char* url, const http_body& body = NoBody, const http_headers& headers = DefaultHeaders) {
  83. return request(HTTP_PUT, url, body, headers);
  84. }
  85. HV_INLINE Response patch(const char* url, const http_body& body = NoBody, const http_headers& headers = DefaultHeaders) {
  86. return request(HTTP_PATCH, url, body, headers);
  87. }
  88. // delete is c++ keyword, we have to replace delete with Delete.
  89. HV_INLINE Response Delete(const char* url, const http_body& body = NoBody, const http_headers& headers = DefaultHeaders) {
  90. return request(HTTP_DELETE, url, body, headers);
  91. }
  92. HV_INLINE int async(Request req, ResponseCallback resp_cb) {
  93. return http_client_send_async(req, resp_cb);
  94. }
  95. }
  96. #endif // HV_REQUESTS_H_