webclient_post_sample.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-03 chenyong the first version
  9. */
  10. #include <string.h>
  11. #include <rtthread.h>
  12. #include <webclient.h>
  13. #define POST_RESP_BUFSZ 1024
  14. #define POST_HEADER_BUFSZ 1024
  15. #define POST_LOCAL_URI "http://www.rt-thread.com/service/echo"
  16. const char *post_data = "RT-Thread is an open source IoT operating system from China!";
  17. int webclient_post_test(int argc, char **argv)
  18. {
  19. struct webclient_session* session = RT_NULL;
  20. unsigned char *buffer = RT_NULL;
  21. char *URI = RT_NULL;
  22. int index, ret = 0;
  23. int bytes_read, resp_status;
  24. if (argc == 1)
  25. {
  26. URI = web_strdup(POST_LOCAL_URI);
  27. if(URI == RT_NULL)
  28. {
  29. rt_kprintf("no memory for create URI buffer.\n");
  30. return -1;
  31. }
  32. }
  33. else if (argc == 2)
  34. {
  35. URI = web_strdup(argv[1]);
  36. if(URI == RT_NULL)
  37. {
  38. rt_kprintf("no memory for create URI buffer.\n");
  39. return -1;
  40. }
  41. }
  42. else
  43. {
  44. rt_kprintf("webclient_post_test [URI] - webclient POST request test.\n");
  45. return -1;
  46. }
  47. buffer = (unsigned char *) web_malloc(POST_RESP_BUFSZ);
  48. if (buffer == RT_NULL)
  49. {
  50. rt_kprintf("no memory for receive response buffer.\n");
  51. ret = -RT_ENOMEM;
  52. goto __exit;
  53. }
  54. /* create webclient session and set header response size */
  55. session = webclient_session_create(POST_HEADER_BUFSZ);
  56. if (session == RT_NULL)
  57. {
  58. ret = -RT_ENOMEM;
  59. goto __exit;
  60. }
  61. /* build header for upload */
  62. webclient_header_fields_add(session, "Content-Length: %d\r\n", strlen(post_data));
  63. webclient_header_fields_add(session, "Content-Type: application/octet-stream\r\n");
  64. /* send POST request by default header */
  65. if ((resp_status = webclient_post(session, URI, post_data)) != 200)
  66. {
  67. rt_kprintf("webclient POST request failed, response(%d) error.\n", resp_status);
  68. ret = -RT_ERROR;
  69. goto __exit;
  70. }
  71. rt_kprintf("webclient POST request response data :\n");
  72. do
  73. {
  74. bytes_read = webclient_read(session, buffer, POST_RESP_BUFSZ);
  75. if (bytes_read <= 0)
  76. {
  77. break;
  78. }
  79. for (index = 0; index < bytes_read; index++)
  80. {
  81. rt_kprintf("%c", buffer[index]);
  82. }
  83. } while (1);
  84. rt_kprintf("\n");
  85. __exit:
  86. if (session)
  87. {
  88. webclient_close(session);
  89. }
  90. if (buffer)
  91. {
  92. web_free(buffer);
  93. }
  94. if (URI)
  95. {
  96. web_free(URI);
  97. }
  98. return ret;
  99. }
  100. #ifdef FINSH_USING_MSH
  101. #include <finsh.h>
  102. MSH_CMD_EXPORT_ALIAS(webclient_post_test, web_post_test, webclient_post_test [URI] - webclient POST request test.);
  103. #endif /* FINSH_USING_MSH */