Closed toddtreece closed 7 years ago
@toddtreece thanks for taking the time to submit this pull request!
Could you please provide example sketches to show what was not working before these changes?
@sandeepmistry sorry for the delay. i just was checking the status of this pull req, and noticed your message. i added a new example called CustomHeaders
that demonstrates the changes that allow for custom request headers.
client.startRequest("/", HTTP_METHOD_GET);
client.sendHeader("X-CUSTOM-HEADER", "custom_value");
client.endRequest();
test server output:
Got a GET request
{ host: '192.168.1.17:8080',
'user-agent': 'Arduino/2.2.0',
connection: 'close',
'x-custom-header': 'custom_value' }
String postData = "name=Alice&age=12";
client.startRequest("/", HTTP_METHOD_POST);
client.sendHeader(HTTP_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded");
client.sendHeader(HTTP_HEADER_CONTENT_LENGTH, postData.length());
client.sendHeader("X-CUSTOM-HEADER", "custom_value");
client.endRequest();
client.write((const byte*)postData.c_str(), postData.length());
test server output:
Got a POST request
{ host: '192.168.1.17:8080',
'user-agent': 'Arduino/2.2.0',
connection: 'close',
'content-type': 'application/x-www-form-urlencoded',
'content-length': '17',
'x-custom-header': 'custom_value' }
{ name: 'Alice', age: '12' }
we have some adafruit io examples that rely on this custom header change, but we don't want to publish tutorials pointing at our fork if we can avoid it. any chance someone could take a quick look at this change?
@toddtreece thanks for the clarification.
I've reviewed the additional example sketch you provided and noticed the call to client.beginRequest();
was missing. When I added this statement the example works as intended without any changes to the library, see modified sketch below.
My suggestion to move forward would be to leave the library side alone, and add a new example sketch for custom headers (like the modified one below).
What do you think?
/*
Custom request header example for the ArduinoHttpClient
library. This example sends a GET request with a custom header every 5 seconds.
note: WiFi SSID and password are stored in config.h file.
If it is not present, add a new tab, call it "config.h"
and add the following variables:
char ssid[] = "ssid"; // your network SSID (name)
char pass[] = "password"; // your network password
based on SimpleGet example by Tom Igoe
header modifications by Todd Treece
this example is in the public domain
*/
#include <ArduinoHttpClient.h>
#include <WiFi101.h>
#include "config.h"
char serverAddress[] = "10.0.1.14"; // server address
int port = 8080;
WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS;
String response;
int statusCode = 0;
void setup() {
Serial.begin(9600);
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid); // print the network name (SSID);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
}
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}
void loop() {
Serial.println("making GET request");
client.beginRequest();
client.get("/");
client.sendHeader("X-CUSTOM-HEADER", "custom_value");
client.endRequest();
// read the status code and body of the response
statusCode = client.responseStatusCode();
response = client.responseBody();
Serial.print("GET Status code: ");
Serial.println(statusCode);
Serial.print("GET Response: ");
Serial.println(response);
Serial.println("Wait five seconds");
delay(5000);
Serial.println("making POST request");
String postData = "name=Alice&age=12";
client.beginRequest();
client.post("/");
client.sendHeader(HTTP_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded");
client.sendHeader(HTTP_HEADER_CONTENT_LENGTH, postData.length());
client.sendHeader("X-CUSTOM-HEADER", "custom_value");
client.endRequest();
client.write((const byte*)postData.c_str(), postData.length());
// read the status code and body of the response
statusCode = client.responseStatusCode();
response = client.responseBody();
Serial.print("POST Status code: ");
Serial.println(statusCode);
Serial.print("POST Response: ");
Serial.println(response);
Serial.println("Wait five seconds");
delay(5000);
}
Server console logs:
$ node examples/node_test_server/getPostPutDelete.js
Server listening on port 8080
Got a GET request
{ host: '10.0.1.14:8080',
'user-agent': 'Arduino/2.2.0',
connection: 'close',
'x-custom-header': 'custom_value' }
{}
Got a POST request
{ host: '10.0.1.14:8080',
'user-agent': 'Arduino/2.2.0',
connection: 'close',
'content-type': 'application/x-www-form-urlencoded',
'content-length': '17',
'x-custom-header': 'custom_value' }
{ name: 'Alice', age: '12' }
Closing this in favour of #20 for now. @toddtreece let us know if you'd still like more changes ...
Changes
This change allows users to build more complex requests with custom headers when using
startRequest
andendRequest
. Calls to theget
,post
,put
, anddel
helpers will end the request as they did before.Tests
SimpleGet.ino:
SimplePost:
SimplePut:
SimpleDelete: