From f56eecbc6fe5c6cbd8202ef6dd089d12de3d9c77 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Wed, 22 Jun 2016 12:47:56 -0400 Subject: [PATCH] Add new responseBody API to simplify reading response body as a String --- HttpClient.cpp | 18 ++++++++++++++++++ HttpClient.h | 7 +++++++ examples/DweetGet/DweetGet.ino | 17 ++--------------- examples/DweetPost/DweetPost.ino | 12 ++---------- examples/HueBlink/HueBlink.ino | 20 +++++--------------- examples/SimpleDelete/SimpleDelete.ino | 12 ++---------- examples/SimpleGet/SimpleGet.ino | 12 ++---------- examples/SimplePost/SimplePost.ino | 12 ++---------- examples/SimplePut/SimplePut.ino | 12 ++---------- keywords.txt | 1 + 10 files changed, 43 insertions(+), 80 deletions(-) diff --git a/HttpClient.cpp b/HttpClient.cpp index 8545aaa..e131272 100644 --- a/HttpClient.cpp +++ b/HttpClient.cpp @@ -509,6 +509,24 @@ int HttpClient::contentLength() return iContentLength; } +String HttpClient::responseBody() +{ + int bodyLength = contentLength(); + String response; + + if (bodyLength > 0) + { + response.reserve(bodyLength); + } + + while (available()) + { + response += (char)read(); + } + + return response; +} + bool HttpClient::endOfBodyReached() { if (endOfHeadersReached() && (contentLength() != kNoContentLengthHeader)) diff --git a/HttpClient.h b/HttpClient.h index 639d7a5..d5633cd 100644 --- a/HttpClient.h +++ b/HttpClient.h @@ -245,6 +245,13 @@ public: */ int contentLength(); + /** Return the response body as a String + Also skips response headers if they have not been read already + MUST be called after responseStatusCode() + @return response body of request as a String + */ + String responseBody(); + /** Enables connection keep-alive mode */ void connectionKeepAlive(); diff --git a/examples/DweetGet/DweetGet.ino b/examples/DweetGet/DweetGet.ino index 7ab952f..96f698d 100644 --- a/examples/DweetGet/DweetGet.ino +++ b/examples/DweetGet/DweetGet.ino @@ -33,7 +33,6 @@ WiFiClient wifi; HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; int statusCode = 0; -int contentLength = 0; String response; void setup() { @@ -65,23 +64,11 @@ void loop() { Serial.println("making GET request"); client.get(path); - // read the status code of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); - - // read the content length of the response - contentLength = client.contentLength(); - Serial.print("Content Length: "); - Serial.println(contentLength); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } - Serial.print("Response: "); Serial.println(response); diff --git a/examples/DweetPost/DweetPost.ino b/examples/DweetPost/DweetPost.ino index d2f0582..201e76c 100644 --- a/examples/DweetPost/DweetPost.ino +++ b/examples/DweetPost/DweetPost.ino @@ -27,7 +27,6 @@ WiFiClient wifi; HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; int statusCode = 0; -int contentLength = 0; String response; void setup() { @@ -69,16 +68,9 @@ void loop() { // send the POST request client.post(path, contentType, postData); - // read the status code and content length of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); - contentLength = client.contentLength(); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); diff --git a/examples/HueBlink/HueBlink.ino b/examples/HueBlink/HueBlink.ino index 3d6a028..a88bec9 100644 --- a/examples/HueBlink/HueBlink.ino +++ b/examples/HueBlink/HueBlink.ino @@ -70,6 +70,8 @@ void sendRequest(int light, String cmd, String value) { request += light; request += "/state/"; + String contentType = "application/json"; + // make a string for the JSON command: String hueCmd = "{\"" + cmd; hueCmd += "\":"; @@ -81,23 +83,11 @@ void sendRequest(int light, String cmd, String value) { Serial.print("JSON command to server: "); // make the PUT request to the hub: - httpClient.beginRequest(); - httpClient.put(request); - httpClient.sendHeader("Content-Type", "application/json"); - httpClient.sendHeader("Content-Length", hueCmd.length()); - httpClient.endRequest(); - httpClient.write((const byte*)hueCmd.c_str(), hueCmd.length()); + httpClient.put(request, contentType, hueCmd); - // read the status code and content length of the response + // read the status code and body of the response int statusCode = httpClient.responseStatusCode(); - int contentLength = httpClient.contentLength(); - - // read the response body - String response = ""; - response.reserve(contentLength); - while (httpClient.available()) { - response += (char)httpClient.read(); - } + String response = httpClient.responseBody(); Serial.println(hueCmd); Serial.print("Status code from server: "); diff --git a/examples/SimpleDelete/SimpleDelete.ino b/examples/SimpleDelete/SimpleDelete.ino index 787a6fe..9304be0 100644 --- a/examples/SimpleDelete/SimpleDelete.ino +++ b/examples/SimpleDelete/SimpleDelete.ino @@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; String response; int statusCode = 0; -int contentLength = 0; void setup() { Serial.begin(9600); @@ -55,16 +54,9 @@ void loop() { client.del("/", contentType, delData); - // read the status code and content length of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); - contentLength = client.contentLength(); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); diff --git a/examples/SimpleGet/SimpleGet.ino b/examples/SimpleGet/SimpleGet.ino index 78c3062..dc68eda 100644 --- a/examples/SimpleGet/SimpleGet.ino +++ b/examples/SimpleGet/SimpleGet.ino @@ -25,7 +25,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; String response; int statusCode = 0; -int contentLength = 0; void setup() { Serial.begin(9600); @@ -51,16 +50,9 @@ void loop() { Serial.println("making GET request"); client.get("/"); - // read the status code and content length of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); - contentLength = client.contentLength(); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); diff --git a/examples/SimplePost/SimplePost.ino b/examples/SimplePost/SimplePost.ino index 341205d..42dfea8 100644 --- a/examples/SimplePost/SimplePost.ino +++ b/examples/SimplePost/SimplePost.ino @@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; String response; int statusCode = 0; -int contentLength = 0; void setup() { Serial.begin(9600); @@ -55,16 +54,9 @@ void loop() { client.post("/", contentType, postData); - // read the status code and content length of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); - contentLength = client.contentLength(); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); diff --git a/examples/SimplePut/SimplePut.ino b/examples/SimplePut/SimplePut.ino index dfca20c..30da9c0 100644 --- a/examples/SimplePut/SimplePut.ino +++ b/examples/SimplePut/SimplePut.ino @@ -26,7 +26,6 @@ HttpClient client = HttpClient(wifi, serverAddress, port); int status = WL_IDLE_STATUS; String response; int statusCode = 0; -int contentLength = 0; void setup() { Serial.begin(9600); @@ -55,16 +54,9 @@ void loop() { client.put("/", contentType, putData); - // read the status code and content length of the response + // read the status code and body of the response statusCode = client.responseStatusCode(); - contentLength = client.contentLength(); - - // read the response body - response = ""; - response.reserve(contentLength); - while (client.available()) { - response += (char)client.read(); - } + response = client.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); diff --git a/keywords.txt b/keywords.txt index dc1140e..00bf130 100644 --- a/keywords.txt +++ b/keywords.txt @@ -33,6 +33,7 @@ noDefaultRequestHeaders KEYWORD2 headerAvailable KEYWORD2 readHeaderName KEYWORD2 readHeaderValue KEYWORD2 +responseBody KEYWORD2 ####################################### # Constants (LITERAL1)