JsonHttpClient.ino 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2022, Benoit BLANCHON
  3. // MIT License
  4. //
  5. // This example shows how to parse a JSON document in an HTTP response.
  6. // It uses the Ethernet library, but can be easily adapted for Wifi.
  7. //
  8. // It performs a GET resquest on https://arduinojson.org/example.json
  9. // Here is the expected response:
  10. // {
  11. // "sensor": "gps",
  12. // "time": 1351824120,
  13. // "data": [
  14. // 48.756080,
  15. // 2.302038
  16. // ]
  17. // }
  18. //
  19. // https://arduinojson.org/v6/example/http-client/
  20. #include <ArduinoJson.h>
  21. #include <Ethernet.h>
  22. #include <SPI.h>
  23. void setup() {
  24. // Initialize Serial port
  25. Serial.begin(9600);
  26. while (!Serial) continue;
  27. // Initialize Ethernet library
  28. byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  29. if (!Ethernet.begin(mac)) {
  30. Serial.println(F("Failed to configure Ethernet"));
  31. return;
  32. }
  33. delay(1000);
  34. Serial.println(F("Connecting..."));
  35. // Connect to HTTP server
  36. EthernetClient client;
  37. client.setTimeout(10000);
  38. if (!client.connect("arduinojson.org", 80)) {
  39. Serial.println(F("Connection failed"));
  40. return;
  41. }
  42. Serial.println(F("Connected!"));
  43. // Send HTTP request
  44. client.println(F("GET /example.json HTTP/1.0"));
  45. client.println(F("Host: arduinojson.org"));
  46. client.println(F("Connection: close"));
  47. if (client.println() == 0) {
  48. Serial.println(F("Failed to send request"));
  49. client.stop();
  50. return;
  51. }
  52. // Check HTTP status
  53. char status[32] = {0};
  54. client.readBytesUntil('\r', status, sizeof(status));
  55. // It should be "HTTP/1.0 200 OK" or "HTTP/1.1 200 OK"
  56. if (strcmp(status + 9, "200 OK") != 0) {
  57. Serial.print(F("Unexpected response: "));
  58. Serial.println(status);
  59. client.stop();
  60. return;
  61. }
  62. // Skip HTTP headers
  63. char endOfHeaders[] = "\r\n\r\n";
  64. if (!client.find(endOfHeaders)) {
  65. Serial.println(F("Invalid response"));
  66. client.stop();
  67. return;
  68. }
  69. // Allocate the JSON document
  70. // Use https://arduinojson.org/v6/assistant to compute the capacity.
  71. const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;
  72. DynamicJsonDocument doc(capacity);
  73. // Parse JSON object
  74. DeserializationError error = deserializeJson(doc, client);
  75. if (error) {
  76. Serial.print(F("deserializeJson() failed: "));
  77. Serial.println(error.f_str());
  78. client.stop();
  79. return;
  80. }
  81. // Extract values
  82. Serial.println(F("Response:"));
  83. Serial.println(doc["sensor"].as<const char*>());
  84. Serial.println(doc["time"].as<long>());
  85. Serial.println(doc["data"][0].as<float>(), 6);
  86. Serial.println(doc["data"][1].as<float>(), 6);
  87. // Disconnect
  88. client.stop();
  89. }
  90. void loop() {
  91. // not used in this example
  92. }
  93. // Performance issue?
  94. // ------------------
  95. //
  96. // EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson.
  97. // See: https://arduinojson.org/v6/how-to/improve-speed/
  98. // See also
  99. // --------
  100. //
  101. // https://arduinojson.org/ contains the documentation for all the functions
  102. // used above. It also includes an FAQ that will help you solve any
  103. // serialization problem.
  104. //
  105. // The book "Mastering ArduinoJson" contains a tutorial on deserialization
  106. // showing how to parse the response from GitHub's API. In the last chapter,
  107. // it shows how to parse the huge documents from OpenWeatherMap
  108. // and Reddit.
  109. // Learn more at https://arduinojson.org/book/
  110. // Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤