| .. _http-client-sample: |
| |
| HTTP Client |
| ########### |
| |
| Overview |
| ******** |
| |
| This sample application shows how to create HTTP 1.1 requests to |
| an HTTP server and how to parse the incoming responses. |
| Supported HTTP 1.1 methods are: GET, HEAD and POST. |
| |
| The source code for this sample application can be found at: |
| :file:`samples/net/http_client`. |
| |
| Requirements |
| ************ |
| |
| - :ref:`networking_with_qemu` |
| - Terminal emulator software |
| - HTTP Server |
| - DNS server (optional) |
| |
| |
| Building and Running |
| ******************** |
| |
| Open the project configuration file for your platform, for example: |
| :file:`prj_qemu_x86.conf` is the configuration file for QEMU. |
| |
| To use QEMU for testing, follow the :ref:`networking_with_qemu` guide. |
| |
| For IPv4 networks, set the following variables: |
| |
| .. code-block:: console |
| |
| CONFIG_NET_IPV4=y |
| CONFIG_NET_IPV6=n |
| |
| IPv6 is the preferred routing technology for this sample application, |
| if CONFIG_NET_IPV6=y is set, the value of CONFIG_NET_IPV4=y is ignored. |
| |
| In this sample application, both static IP addresses and DHCPv4 are supported. |
| Static IP addresses are specified in the project configuration file, |
| for example: |
| |
| .. code-block:: console |
| |
| CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1" |
| CONFIG_NET_APP_PEER_IPV6_ADDR="2001:db8::2" |
| |
| are the IPv6 addresses for the HTTP client running Zephyr and the |
| HTTP server, respectively. The application also supports DNS resolving so the |
| peer address is resolved automatically if host name is given, so you |
| can also write the HTTP server name like this: |
| |
| .. code-block:: console |
| |
| CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1" |
| CONFIG_NET_APP_PEER_IPV6_ADDR="6.zephyr.test" |
| |
| Open the :file:`src/config.h` file and set the server port |
| to match the HTTP server setup, for example: |
| |
| .. code-block:: c |
| |
| #define SERVER_PORT 8000 |
| |
| assumes that the HTTP server is listening at the TCP port 8000. |
| |
| HTTP Server |
| =========== |
| |
| Sample code for a very simple HTTP server can be downloaded from the |
| zephyrproject-rtos/net-tools project area: |
| https://github.com/zephyrproject-rtos/net-tools |
| |
| Open a terminal window and type: |
| |
| .. code-block:: console |
| |
| $ cd net-tools |
| $ ./http-server.sh |
| |
| |
| DNS setup |
| ========= |
| |
| The net-tools project provides a simple DNS resolver. You can activate |
| it like this if you want to test the DNS resolving with HTTP client. |
| |
| Open a terminal window and type: |
| |
| .. code-block:: console |
| |
| $ cd net-tools |
| $ ./dnsmasq.sh |
| |
| |
| Sample Output |
| ============= |
| |
| This sample application loops a specified number of times doing several |
| HTTP 1.1 requests and printing some output. The requests are: |
| |
| - GET "/index.html" |
| - HEAD "/" |
| - POST "/post_test.php" |
| - GET "/big-file.html" |
| |
| The terminal window where QEMU is running will show something similar |
| to the following: |
| |
| .. code-block:: console |
| |
| [http-client] [INF] do_sync_http_req: [19] Send /index.html |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: HTTP body: 170 bytes, expected: 170 bytes |
| [http-client] [INF] do_sync_http_req: [19] Send / |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: [19] Send /post_test.php |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: HTTP body: 24 bytes, expected: 24 bytes |
| [http-client] [INF] do_sync_http_req: [20] Send /index.html |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: HTTP body: 170 bytes, expected: 170 bytes |
| [http-client] [INF] do_sync_http_req: [20] Send / |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: [20] Send /post_test.php |
| [http-client] [INF] do_sync_http_req: HTTP server response status: OK |
| [http-client] [INF] do_sync_http_req: HTTP body: 24 bytes, expected: 24 bytes |
| [http-client] [INF] main: --------Sending 20 async request-------- |
| [http-client] [INF] do_async_http_req: [1] Send /index.html |
| [http-client] [INF] response: Received 356 bytes piece of data |
| [http-client] [INF] response: HTTP server response status: OK |
| [http-client] [INF] response: HTTP body: 170 bytes, expected: 170 bytes |
| [http-client] [INF] do_async_http_req: [1] Send / |
| [http-client] [INF] response: HTTP server response status: OK |
| [http-client] [INF] do_async_http_req: [1] Send /post_test.php |
| [http-client] [INF] response: Received 163 bytes piece of data |
| [http-client] [INF] response: HTTP server response status: OK |
| [http-client] [INF] response: HTTP body: 24 bytes, expected: 24 bytes |
| [http-client] [INF] do_async_http_req: [1] Send /big-file.html |
| [http-client] [INF] response: Received 657 bytes piece of data |
| [http-client] [INF] response: Received 640 bytes piece of data |
| [http-client] [INF] response: Received 418 bytes piece of data |
| [http-client] [INF] response: HTTP server response status: OK |
| [http-client] [INF] response: HTTP body: 1528 bytes, expected: 1528 bytes |