How to use ArduinoJson with HTTPClient?
HTTPClient is a class that performs HTTP requests on ESP8266 and ESP32.
Assuming that the board is connected to the WiFi network, you can send an HTTP request like so:
WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.begin(client, "http://arduinojson.org/example.json"); http.GET(); // Print the response Serial.print(http.getString()); // Disconnect http.end();
While you can perform HTTP request without
HTTPClient (cf “See also” below), this class greatly simplifies your code.
On ESP8266, this class is provided by the ESP8266HTTPClient library, which is bundled with the ESP8266 core for Arduino.
On ESP32, it’s provided by the HTTPClient library, which is bundled with the Arduino core for the ESP32.
For HTTPS, you need to use
WiFiClientSecure instead of
You must also choose the certificate validation strategy by calling
WiFiClientSecure::setInsecure(), for example.
How to parse a JSON document from an HTTP response?
HTTPClient doesn’t implement the
Stream interface, so you cannot pass it directly to
deserializeJson() like so:
deserializeJson(doc, http); // error: 'class HTTPClient' has no member named 'read'; did you mean 'end'?
We could pass the result of
http.getString() directly to
deserializeJson(), but it would be quite inefficient because it would copy the complete response in RAM before parsing.
We can do much better by letting ArduinoJson pull the bytes from the HTTP response.
To do that, we must get
Stream by calling
http.getStream() instead of
Unfortunately, by using the underlying
Stream, we bypass the code that handles chunked transfer encoding, so we must switch to HTTP version 1.0.
WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.useHTTP10(true); http.begin(client, "http://arduinojson.org/example.json"); http.GET(); // Parse response DynamicJsonDocument doc(2048); deserializeJson(doc, http.getStream()); // Read values Serial.println(doc["time"].as<long>()); // Disconnect http.end();
Remember to call
useHTTP10(true) when you use
deserializeJson() will return
Notice that I used a
DynamicJsonDocument here because the document is quite large.
Feel free to use a
StaticJsonDocument if your document is smaller.
As always, use the ArduinoJson Assistant to compute the right capacity for your project.
How to send a JSON document in an HTTP request?
HTTPClient doesn’t let us use the same trick as above, so we have to use a temporary buffer.
Here is how we can do so with a
// Prepare JSON document DynamicJsonDocument doc(2048); doc["hello"] = "world"; // Serialize JSON document String json; serializeJson(doc, json); WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.begin(client, "http://httpbin.org/post"); http.POST(json); // Read response Serial.print(http.getString()); // Disconnect http.end();
If you run this program, you’ll see that it prints information on the HTTP requests. That’s the response returned by httpbin.org; it’s very handy to debug your programs.
You can significantly improve this code’s performance by calling
Here are some other tips for using the
String class efficiently.
If you want to send the payload as a stream, you need to use
WiFiClient directly, as shown in the Serialization Tutorial (around page 127).
Why is the
The most likely explanation is that the server returned a redirection code, like 301 Moved Permanently or 302 Found.
This feature was added quite recently on ESP32, so make sure you are up-to-date.
BONUS: How to see the document when I use a
As we saw, it’s more efficient to pass the
deserializeJson() because it saves a large amount of memory.
However, we cannot directly print the content of the
Stream to see what was sent to ArduinoJson.
To see the content that is received from the HTTP response, we can use the
ReadLoggingStream from the StreamUtils library.
ReadLoggingStream loggingStream(http.getStream(), Serial); deserializeJson(doc, loggingStream);
ReadLoggingStream will forward everything to
deserializeJson() and will print the content to the serial port.
StreamUtils is a powerful library that deserves more attention. Please give it a star to spread the word.
- The GitHub example in chapter 3 of Mastering ArduinoJson uses
HTTPClientto interact with GitHub’s API.
This chapter is available for free, see Deserialization Tutorial.
- The Reddit case study in chapter 8 of Mastering ArduinoJson shows how to perform HTTP requests without