Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MQTTGateway2 MQTTGatewayK64 http-example-wnc GuardRoom ... more
README.md@14:3004056e4661, 2017-03-30 (annotated)
- Committer:
 - Jan Jongboom 
 - Date:
 - Thu Mar 30 15:13:37 2017 +0200
 - Revision:
 - 14:3004056e4661
 - Parent:
 - 12:530c2ebee349
 - Child:
 - 19:a5371b71de6f
 
Request with a body, but without Content-Length header should pretend it's chunked to allocate enough memory
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| Jan Jongboom  | 
0:910f5949759f | 1 | # HTTP and HTTPS library for mbed OS 5 | 
| Jan Jongboom  | 
0:910f5949759f | 2 | |
| Jan Jongboom  | 
0:910f5949759f | 3 | This library is used to make HTTP and HTTPS calls from mbed OS 5 applications. | 
| Jan Jongboom  | 
0:910f5949759f | 4 | |
| Jan Jongboom  | 
0:910f5949759f | 5 | ## HTTP Request API | 
| Jan Jongboom  | 
0:910f5949759f | 6 | |
| Jan Jongboom  | 
0:910f5949759f | 7 | ```cpp | 
| Jan Jongboom  | 
0:910f5949759f | 8 | NetworkInterface* network = /* obtain a NetworkInterface object */ | 
| Jan Jongboom  | 
0:910f5949759f | 9 | |
| Jan Jongboom  | 
0:910f5949759f | 10 | const char body[] = "{\"hello\":\"world\"}"; | 
| Jan Jongboom  | 
0:910f5949759f | 11 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 12 | HttpRequest* request = new HttpRequest(network, HTTP_POST, "http://httpbin.org/post"); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 13 | request->set_header("Content-Type", "application/json"); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 14 | HttpResponse* response = request->send(body, strlen(body)); | 
| Jan Jongboom  | 
0:910f5949759f | 15 | // if response is NULL, check response->get_error() | 
| Jan Jongboom  | 
0:910f5949759f | 16 | |
| Jan Jongboom  | 
0:910f5949759f | 17 | printf("status is %d - %s\n", response->get_status_code(), response->get_status_message()); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 18 | printf("body is:\n%s\n", response->get_body_as_string().c_str()); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 19 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 20 | delete request; // also clears out the response | 
| Jan Jongboom  | 
0:910f5949759f | 21 | ``` | 
| Jan Jongboom  | 
0:910f5949759f | 22 | |
| Jan Jongboom  | 
0:910f5949759f | 23 | ## HTTPS Request API | 
| Jan Jongboom  | 
0:910f5949759f | 24 | |
| Jan Jongboom  | 
0:910f5949759f | 25 | ```cpp | 
| Jan Jongboom  | 
0:910f5949759f | 26 | // pass in the root certificates that you trust, there is no central CA registry in mbed OS | 
| Jan Jongboom  | 
0:910f5949759f | 27 | const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" | 
| Jan Jongboom  | 
0:910f5949759f | 28 | /* rest of the CA root certificates */; | 
| Jan Jongboom  | 
0:910f5949759f | 29 | |
| Jan Jongboom  | 
0:910f5949759f | 30 | NetworkInterface* network = /* obtain a NetworkInterface object */ | 
| Jan Jongboom  | 
0:910f5949759f | 31 | |
| Jan Jongboom  | 
0:910f5949759f | 32 | const char body[] = "{\"hello\":\"world\"}"; | 
| Jan Jongboom  | 
0:910f5949759f | 33 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 34 | HttpsRequest* request = new HttpsRequest(network, SSL_CA_PEM, HTTP_GET "https://httpbin.org/status/418"); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 35 | HttpResponse* response = request->send(); | 
| Jan Jongboom  | 
0:910f5949759f | 36 | // if response is NULL, check response->get_error() | 
| Jan Jongboom  | 
0:910f5949759f | 37 | |
| Jan Jongboom  | 
0:910f5949759f | 38 | printf("status is %d - %s\n", response->get_status_code(), response->get_status_message()); | 
| Jan Jongboom  | 
0:910f5949759f | 39 | printf("body is:\n%s\n", response->get_body().c_str()); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 40 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 41 | delete request; | 
| Jan Jongboom  | 
0:910f5949759f | 42 | ``` | 
| Jan Jongboom  | 
0:910f5949759f | 43 | |
| Jan Jongboom  | 
0:910f5949759f | 44 | ## Dealing with large body | 
| Jan Jongboom  | 
0:910f5949759f | 45 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 46 | By default the library will store the full request body on the heap. This works well for small responses, but you'll run out of memory when receiving a large response body. To mitigate this you can pass in a callback as the last argument to the request constructor. This callback will be called whenever a chunk of the body is received. You can set the request chunk size in the `HTTP_RECEIVE_BUFFER_SIZE` macro (see `mbed_lib.json` for the definition) although it also depends on the buffer size of the underlying network connection. | 
| Jan Jongboom  | 
0:910f5949759f | 47 | |
| Jan Jongboom  | 
0:910f5949759f | 48 | ```cpp | 
| Jan Jongboom  | 
0:910f5949759f | 49 | void body_callback(const char* data, size_t data_len) { | 
| Jan Jongboom  | 
0:910f5949759f | 50 | // do something with the data | 
| Jan Jongboom  | 
0:910f5949759f | 51 | } | 
| Jan Jongboom  | 
0:910f5949759f | 52 | |
| Jan Jongboom  | 
5:2456c90f02e9 | 53 | HttpRequest* req = new HttpRequest(network, HTTP_GET, "http://pathtolargefile.com"); | 
| Jan Jongboom  | 
5:2456c90f02e9 | 54 | req->send(NULL, 0, body_callback); | 
| Jan Jongboom  | 
0:910f5949759f | 55 | ``` | 
| Jan Jongboom  | 
0:910f5949759f | 56 | |
| Jan Jongboom  | 
12:530c2ebee349 | 57 | ## Socket re-use | 
| Jan Jongboom  | 
12:530c2ebee349 | 58 | |
| Jan Jongboom  | 
12:530c2ebee349 | 59 | By default the library opens a new socket per request. This is wasteful, especially when dealing with TLS requests. You can re-use sockets like this: | 
| Jan Jongboom  | 
12:530c2ebee349 | 60 | |
| Jan Jongboom  | 
12:530c2ebee349 | 61 | ### HTTP | 
| Jan Jongboom  | 
12:530c2ebee349 | 62 | |
| Jan Jongboom  | 
12:530c2ebee349 | 63 | ```cpp | 
| Jan Jongboom  | 
12:530c2ebee349 | 64 | TCPSocket* socket = new TCPSocket(); | 
| Jan Jongboom  | 
12:530c2ebee349 | 65 | |
| Jan Jongboom  | 
12:530c2ebee349 | 66 | nsapi_error_t open_result = socket->open(network); | 
| Jan Jongboom  | 
12:530c2ebee349 | 67 | // check open_result | 
| Jan Jongboom  | 
12:530c2ebee349 | 68 | |
| Jan Jongboom  | 
12:530c2ebee349 | 69 | nsapi_error_t connect_result = socket->connect("httpbin.org", 80); | 
| Jan Jongboom  | 
12:530c2ebee349 | 70 | // check connect_result | 
| Jan Jongboom  | 
12:530c2ebee349 | 71 | |
| Jan Jongboom  | 
12:530c2ebee349 | 72 | // Pass in `socket`, instead of `network` as first argument | 
| Jan Jongboom  | 
12:530c2ebee349 | 73 | HttpRequest* req = new HttpRequest(socket, HTTP_GET, "http://httpbin.org/status/418"); | 
| Jan Jongboom  | 
12:530c2ebee349 | 74 | ``` | 
| Jan Jongboom  | 
12:530c2ebee349 | 75 | |
| Jan Jongboom  | 
12:530c2ebee349 | 76 | ### HTTPS | 
| Jan Jongboom  | 
12:530c2ebee349 | 77 | |
| Jan Jongboom  | 
12:530c2ebee349 | 78 | ```cpp | 
| Jan Jongboom  | 
12:530c2ebee349 | 79 | TLSSocket* socket = new TLSSocket(network, "httpbin.org", 443, SSL_CA_PEM); | 
| Jan Jongboom  | 
12:530c2ebee349 | 80 | socket->set_debug(true); | 
| Jan Jongboom  | 
12:530c2ebee349 | 81 | if (socket->connect() != 0) { | 
| Jan Jongboom  | 
12:530c2ebee349 | 82 | printf("TLS Connect failed %d\n", socket->error()); | 
| Jan Jongboom  | 
12:530c2ebee349 | 83 | return 1; | 
| Jan Jongboom  | 
12:530c2ebee349 | 84 | } | 
| Jan Jongboom  | 
12:530c2ebee349 | 85 | |
| Jan Jongboom  | 
12:530c2ebee349 | 86 | // Pass in `socket`, instead of `network` as first argument, and omit the `SSL_CA_PEM` argument | 
| Jan Jongboom  | 
12:530c2ebee349 | 87 | HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, "https://httpbin.org/status/418"); | 
| Jan Jongboom  | 
12:530c2ebee349 | 88 | ``` | 
| Jan Jongboom  | 
12:530c2ebee349 | 89 | |
| Jan Jongboom  | 
0:910f5949759f | 90 | ## Tested on | 
| Jan Jongboom  | 
0:910f5949759f | 91 | |
| Jan Jongboom  | 
0:910f5949759f | 92 | * K64F with Ethernet. | 
| Jan Jongboom  | 
0:910f5949759f | 93 | * NUCLEO_F411RE with ESP8266. |