LWIP官方httpd使用之GET

发布时间 2023-12-08 18:08:36作者: USTHzhanglu

前言

httpd的移植可以参考上篇文章LWIP官方DEMO使用之httpd服务 - USTHzhanglu - 博客园 (cnblogs.com)

此博文为学习笔记,仅介绍如何使用官方demo,无更深入分析。
此博文介绍了如何通过GET返回各种数据。

关键词:LWIP, HTTP, HTTPD, GET

| LWIP版本 | lwip-STABLE-2_2_0_RC1 |

GET

GET
最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind,这样通过GET方式传递的数据直接表示在地址中。

访问网页本身就是一个GET请求(毕竟本质上是从server获取html网页数据后展示),在访问lwip.local时,debug时信息如下:

ttp_accept 1ffead78 / 00000000
http_recv: pcb=1ffead78 pbuf=1ffedd84 err=Ok.
Received 487 bytes
First pbuf
CRLF received, parsing request
Received GET request"
Received "GET" request for URI: "/"
Looking for /index.shtml...
Looking for /index.ssi...
Looking for /index.shtm...
Looking for /index.html...
Opened.

尝试用GET获取图片数据:

可以看到,返回了一个图片数据。

通过makefsdata,将需要的资源提前烧录到flash中,可以很方便的通过GET url的方式获取。

问题来了,假如想动态读取MCU里的某种数据呢?
类似于访问https://dog.ceo/api/breeds/image/random
会得到一个json数据,其中包含了一个随机的dog图片url

{
    "message": "https://images.dog.ceo/breeds/coonhound/n02089078_3191.jpg",
    "status": "success"
}

这种是没法通过提前烧录资源实现的。
一般情况下,我们会想到解析到对应url后,手动拼接字符串并返回来实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main() {
    char* url = "http://example.com";
    char* method = "GET";
    char* headers[] = {
        "Content-Type: application/json",
        "Accept: application/json"
    };
    int header_count = sizeof(headers) / sizeof(char*);
    char* body = "{ \"current_time\": \"";
    time_t t = time(NULL);
    char* time_str = ctime(&t);
    body += time_str;
    body += "}\"";
    int len = strlen(url) + strlen(method) + header_count * sizeof(char*) + strlen(body);
    char* full_url = malloc(len + 1);
    strcpy(full_url, url);
    strcat(full_url, " ");
    strcat(full_url, method);
    for (int i = 0; i < header_count; i++) {
        strcat(full_url, "\r\n");
        strcat(full_url, headers[i]);
    }
    strcat(full_url, "\r\n\r\n");
    strcat(full_url, body);
    printf("Full URL: %s\n", full_url);
    free(full_url);
    return 0;
}

运行后输出的结果如下:

Full URL: http://example.com GET 
Content-Type: application/json 
Accept: application/json 
{ "current_time": "Thu Jan 26 16:14:03 2023 }

以上方法太繁琐了,而且既然用LWIP了,在自己拼接字符串,实在是太过愚蠢了。

下面将介绍如何通过自带的API实现GET动态数据功能