首页 > 其他分享 >LWIP官方httpd使用之GET

LWIP官方httpd使用之GET

时间:2023-12-08 18:14:26浏览次数:52  
标签:httpd full LWIP GET url strcat char

前言

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动态数据功能

标签:httpd,full,LWIP,GET,url,strcat,char
From: https://www.cnblogs.com/USTHzhanglu/p/17888641.html

相关文章

  • Get-WindowsCapability -Online
    Get-WindowsCapability-OnlineName :Accessibility.Braille~~~~0.0.1.0State:NotPresentName :App.StepsRecorder~~~~0.0.1.0State:InstalledName :Browser.InternetExplorer~~~~0.0.11.0State:InstalledName :DirectX.Configuration.Database~~~~0.0.1.0S......
  • PS C:\Users\Administrator> Get-WindowsFeature
    DisplayName                      Name           InstallState------------                      ----           -------------[......
  • uniapp滑动页面时警告Unable to preventDefault inside passive event listener due t
    翻译:没有添加被动事件监听器来阻止’touchstart‘事件,请考虑添加事件管理者’passive’,以使页面更加流畅。原因:由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault(),这就导致了浏览器不能及时响应滚动,略有延迟。所以为了让页面滚动的效果如丝般顺滑......
  • How to get printk format specifiers right (如何正确使用printk格式说明符)(翻译 by
    原文:https://www.kernel.org/doc/html/latest/core-api/printk-formats.html#printk-specifiers如何正确使用printk格式说明符整数类型如果变量是Type类型,则使用printk格式说明符:signedchar%d或%hhxunsignedchar%u或%xchar......
  • 安卓Wifimanager.getConfiguredNetworks()返回null的解决方法
    修改AndroidManifest.xml文件,添加以下权限;<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permissionandroi......
  • Python requests 模块 get请求和post请求
    前言全局说明requests模块get请求和post请求一、get请求importrequestsurl="https://www.baidu.com"my_headers={ "User-Agent":"Mozilla/5.0", "Referer":"http://baiud.com"}res=requests.get(url)print(res.status_......
  • P6入门:项目初始化4-项目详情之预算日志及汇总Budget
    前言使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等,在接下来的博文中,我将结合官方帮助介绍这些基本设置,希望给对P6感兴趣的人带来帮助。涉及P6 项目详情设置包括:G......
  • ant 想在一个target里根据参数是不是为true 去决定是否调用另一个target
    我起初是想解决同一个tomcat下运行两个相同项目的问题,这个需要web.xml里的webAppRootKey进行区分。一个为webApp.root,另一个则改为xxx.root但是需要在编译前就改为,否则运行报错<targetname="init"depends="clean"description="初始化">......<echo>初始化工作结......
  • 无涯教程-Erlang - get函数
    此方法用于获取映射中特定键的值。get-语法get(key,map)key   - 这是需要为其返回值的键。Map  - 这是需要在其中搜索键的Map。get-返回值如果在Map上找到键,则返回值。-module(helloLearnfk).-export([start/0]).start()->Lst1=[{"a",1},{"......
  • 深入理解泛型(经典详解):<T> T 和 T的使用以及public <E> List<E> get()泛型方法详解、类型擦
     一、为什么要使用泛型?    泛型俗称“标签”,使用<E>表示。泛型就是在允许定义类,接口时通过一个标识表示某个属性的类型或者是某个方法的返回值或者是参数类型,参数类型在具体使用的时候确定,在使用之前对类型进行检查。     泛型意味着编写的代码可以被很多不同......