首页 > 其他分享 >evhttp post get 处理

evhttp post get 处理

时间:2023-07-31 13:56:34浏览次数:32  
标签:请求 get buffer GET post 解析 POST evhttp

evhttp处理POST请求的技巧 - 爱码网 (likecs.com)

evhttp是libevent提供的一个轻量级的基于消息驱动的HTTP Server,详细的资料可以参考libevent的主页:http://monkey.org/~provos/libevent/ ,本文主要描述如何处理POST请求。

 

美中不足:evhttp不支持POST

evhttp在evhttp_request接口中包含一个请求类型type,用来表示HTTP的操作(EVHTTP_REQ_GET,EVHTTP_REQ_POST),但evhttp接口并没有区分GET和POST操作,我们来看具体的接口实现:

evhttp_request_uri: 解析HTTP请求中的ur;

evhttp_parse_query: 解析名值对;

 

对于GET操作来说,这两个函数已经满足要求,例如:处理如下GET请求:

http://foo.com/?q=test&s=some+thing

evhttp_request_uri: 解析HTTP请求中的ur,得到/?q=test&s=some+thing

evhttp_parse_query: 解析名值对,得到一个evkeyvalq结构,里面包含了key/value

的数组.

 

但如果这个请求是用POST发送的,那么这两个函数就不适应了:

evhttp_request_uri: 解析HTTP请求中的ur,得到/

evhttp_parse_query: 解析名值对,q=test&s=some+thing是保存在消息体中而不是uri中,因此解析后是一个空的结构。

 

除此之外,evhttp并没有提供接口访问POST的消息体中的数据。

 

曲径通幽:如何处理POST请求?

既然这样,难道用evhttp就不能使用POST请求了么?当然不是,只不过相对GET来说,我们要多费一些周折。下面就介绍如何在evhttp中处理POST请求。

 

  1. 访问缓冲区获取POST消息体数据

evhttp_request结构中包含input_buf结构,input_buffer中的buffer就是存放消息体数据的缓冲区,input_buffer还有一个orig_buffer,实际上和buffer指向的是同一块内存空间,不知道为什么这样设计,但我们用的时候直接用buffer就可以了。

 

但这里的buffer并不是全部存放消息体中的数据,buffer的大小是2的N次方,而且总是和实际数据长度最接近的2的N次方,个人猜测evhttp可能使用了slab之类的内存预分配机制,所以这样处理。

那么我们如何取到真正的数据呢?其实很简单:input_buffer有一个offset字段,就是用来指明具体的数据长度的。实际使用的时候,你只要memcpy一把就可以了。

 

  1. 模拟GET请求参数

如果你的POST请求消息体中存放的是标准的key=value&key=value.....这种格式的数据,你当然可以自己去解析它,但更聪明的办法是模拟GET请求,再调用evhttp_parse_query函数来帮你解析。

 

具体步骤如下:

1)      参照“访问缓冲区获取POST消息体数据”的指导获取数据;

2)      将第一步获取的数据解码成普通的字符串;

3)      evhttp_request_uri解析出uri

4)      组装成/?q=test&s=some+thing格式的字符串,注意要自己加上问号”?”

5)      调用evhttp_parse_query解析组装的字符串

 

需要注意的是:如果你的POST请求消息体中的数据不是这种key=value&key=value.....的格式,那么就只能自己处理了,这应该也是evhttp不提供POST请求通用处理的原因吧。

标签:请求,get,buffer,GET,post,解析,POST,evhttp
From: https://www.cnblogs.com/hshy/p/17593243.html

相关文章

  • postgresql的相关利用
    有比较多的安全设备或者web系统使用postgresql作为数据库,研究postgresql数据库如何getshell将有很大帮助外联postgresql默认本地连接(5432端口),远程连接需要找到postgres安装目录下的/data/pg_hba.conf,在IPv4配置处加上:hostallall192.168.0.1/24scram-sha-256之后重启post......
  • kernel: oracle (xxxx): Using mlock ulimits for SHM_HUGETLB is deprecated
    Oracle数据库运行在linux6/7中,启用大页之后,我们经常在/var/log/messages里面会看到类似这样的记录:Jul3109:46:27p1erpdb01kernel:oracle(6444):UsingmlockulimitsforSHM_HUGETLBisdeprecated.-------官方文档HowToAddanon-rootgrouptohugetlb_shm_grou......
  • getent
    getent查询DNS名称服务器中的命名空间语法getent[选项]主机名或域名选项-h#显示帮助信息-n#不解析DNS名称-p#打印解析过程-s#只输出有关已知主机的信息-t#指定DNS查询类型(默认为NXDOMAIN)-U#使用顶级域名服务器-V#显示版......
  • Postgresql 在Ubuntuserver 22.04上部署
    安装与卸载系统环境:1.ubuntu22.04server安装1.检查是否已经安装#psql服务sudoservicepostgresqlstatus#版本查看psql--version2.安装命令#更新安装源内容sudoapt-getupdate#postgresql-contrib额外特性安装sudoaptinstallpostgresqlpostgresql......
  • springboot的controller如何拿到post请求中的json数据
    在SpringBoot的Controller中,可以使用注解@RequestBody来获取POST请求中的JSON数据。我们可以将这个注解应用到一个Controller方法的参数上,Spring将会负责读取请求正文中的数据,将其反序列化为一个Java对象,并将其作为Controller方法的参数传递。以Java代码为例,示例代码如下:@RestC......
  • odoo post account move
    D:\odoo\odoo16\addons\stock_account\models\stock_valuation_layer.py_validate_accounting_entriesifam_vals:print(am_vals)print('-------------------------------------')foreachinam_vals:......
  • AJAX--ajax的post请求
    一、post请求<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>ajaxPOST请求</t......
  • AJAX--ajax的get请求
    一、get请求前端代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>ajaxget请求<......
  • 关于处理HTTP Get请求ULR过长导致报400错误码的问题
    运行环境:Win11,VS2022现象:使用swagger,Postman发起一个GET请求,返回:HTTPError400.TherequestURLisinvalid. 另外ResponseHeaders中显示Server:Microsoft-HttpApi/2.0原因:是由于Get请求的URL字符串长度过长,导致HTTP.sys服务拦截并终止。解决方案:在注册表项:计算......
  • apue.3e遇到的编译问题(recipe for target 'badexit2' failed)以及ls1.c案例测试
    APUE(慢慢啃这本书)编译问题,网上获得的前辈方法,本地测试可行,仅作记录。1.系统环境2.下载解压tar-zxvf*.tar.gzcd./apue.3emake报错:collect2:error:ldreturned1exitstatusMakefile:31:recipefortarget'badexit2'failedmake[1]:***[badexit2]Error1m......