Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
http
Webclient
web client HTTP post的时候,出现返回值为500的问题
发布于 2024-02-20 10:40:36 浏览:481
订阅该版
1:创建session ``` session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ); ``` 2:调用webclient_post ``` rc = webclient_post(session, L_POST_NE_URL, NULL, 0); ``` 3: 发送综合部分 ``` /* send mime_multipart */ webclient_write(session, buffer, buffer_ptr - buffer); ``` 4:发送文件数据 ``` /* send file data */ write_session_data(req, session, buffer); ``` 5:发送分隔符 ``` webclient_write(session, buffer, rt_strlen(boundary) + 8); ``` 6:调用返回函数,解析返回参数值 ``` ret = webclient_handle_response(session); ``` 7:函数代码片段 ``` void query_and_post_http_file(evs_service_query_log req, char *uploadUrl) { #define L_POST_NE_URL "http://operation-pre.ne-soft.com/api/com/pileData/file/upload?secretKey=077ac7289f8b4f7080943bb081734442&taskCode=c08bde9536594ad9bad6bb13c795fc06&pileCode=DR2024010211202100175001&upfile" size_t length; char boundary[60]; char form_data[FORM_DATA_LEN]; char url_buffer[URL_BUFF_LEN]; int fd = -1, rc = WEBCLIENT_OK; char *header = RT_NULL, *header_ptr; unsigned char *buffer = RT_NULL, *buffer_ptr; struct webclient_session* session = RT_NULL; int resp_data_len = 0; uint8_t dot_cnt; dot_cnt = count_dot(uploadUrl); replaceString(uploadUrl, url_buffer, dot_cnt); // rt_snprintf(url_buffer, URL_BUFF_LEN, LOG_NE_URL, uploadUrl, req.logQueryNo); // rt_snprintf(url_buffer, URL_BUFF_LEN, "%s", uploadUrl); rt_kprintf("%s %d\r\n", url_buffer, __LINE__); rt_kprintf("req.askType[%d] %d\r\n", req.askType, __LINE__); switch(req.askType) { case E_LOG_TYPE_TRACE: rt_snprintf(form_data, FORM_DATA_LEN, FORM_DATA, "/log/trace.log0"); rt_kprintf("form_data[%s] %d\r\n", form_data, __LINE__); break; case E_LOG_TYPE_ALARM: rt_snprintf(form_data, FORM_DATA_LEN, FORM_DATA, "/log/alarm.log0"); break; case E_LOG_TYPE_ORDER: rt_snprintf(form_data, FORM_DATA_LEN, FORM_DATA, "/order/order_record0.dat"); break; case E_LOG_TYPE_ELEC_METER: rt_snprintf(form_data, FORM_DATA_LEN, FORM_DATA, "/log/meter.log0"); break; case E_LOG_TYPE_BMS: rt_snprintf(form_data, FORM_DATA_LEN, FORM_DATA, "/log/bms.log0"); break; default: break; } buffer = (unsigned char *) web_calloc(1, WEBCLIENT_RESPONSE_BUFSZ); if (buffer == RT_NULL) { LOG_D("post file failed, no memory for response buffer."); rc = -WEBCLIENT_NOMEM; goto __exit; } header = (char *) web_calloc(1, WEBCLIENT_HEADER_BUFSZ); if (header == RT_NULL) { LOG_D("post file failed, no memory for header buffer."); rc = -WEBCLIENT_NOMEM; goto __exit; } header_ptr = header; /* build boundary */ rt_snprintf(boundary, sizeof(boundary), "----------------------------%012d", rt_tick_get()); /* build encapsulated mime_multipart information*/ buffer_ptr = buffer; /* first boundary */ buffer_ptr += rt_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "--%s\r\n", boundary); buffer_ptr += rt_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "Content-Disposition: form-data; %s\r\n", form_data); buffer_ptr += rt_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "Content-Type: application/octet-stream\r\n\r\n"); /* calculate content-length */ length += buffer_ptr - buffer; length += rt_strlen(boundary) + 8; /* add the last boundary */ /* build header for upload */ header_ptr += rt_snprintf(header_ptr, WEBCLIENT_HEADER_BUFSZ - (header_ptr - header), "Content-Length: %d\r\n", length); header_ptr += rt_snprintf(header_ptr, WEBCLIENT_HEADER_BUFSZ - (header_ptr - header), "Content-Type: multipart/form-data; boundary=%s\r\n", boundary); session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ); if(session == RT_NULL) { rc = -WEBCLIENT_NOMEM; goto __exit; } rt_strncpy(session->header->buffer, header, rt_strlen(header)); session->header->length = rt_strlen(session->header->buffer); rt_kprintf("buffer(%s) line[%d]\r\n", session->header->buffer, __LINE__); // rc = webclient_post(session, url_buffer, NULL, 0); rc = webclient_post(session, L_POST_NE_URL, NULL, 0); if(rc < 0) { goto __exit; } /* send mime_multipart */ webclient_write(session, buffer, buffer_ptr - buffer); rt_kprintf("come to this step [%d]\r\n", __LINE__); /* send file data */ write_session_data(req, session, buffer); /* send last boundary */ rt_snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", boundary); webclient_write(session, buffer, rt_strlen(boundary) + 8); extern int webclient_handle_response(struct webclient_session *session); int ret = 0; ret = webclient_handle_response(session); rt_kprintf("webclient_handle_response ret[%d] line[%d]\r\n", ret, __LINE__); evs_NEevent_fileUploadResult result; if(ret != 200) { rc = -WEBCLIENT_ERROR; result.cmdId = 30; // 文件上传命令码为30 result.result = 11; // 失败 result.reason = ret; memcpy(result.logQueryNo, req.logQueryNo, sizeof(req.logQueryNo)); // 失败 // send_event_NE_file_upload_result(&result); goto __exit; } resp_data_len = webclient_content_length_get(session); if (resp_data_len > 0) { int bytes_read = 0; rt_memset(buffer, 0x00, WEBCLIENT_RESPONSE_BUFSZ); do { bytes_read = webclient_read(session, buffer, resp_data_len < WEBCLIENT_RESPONSE_BUFSZ ? resp_data_len : WEBCLIENT_RESPONSE_BUFSZ); if (bytes_read <= 0) { break; } resp_data_len -= bytes_read; rt_kprintf("recv_data[%s] line[%d]\r\n", buffer, __LINE__); json_t instance = json_new(buffer); const char *name; if (json_value(instance, "data")) { json_t item = json_toChild(instance); if (item) { if (json_value(item, "fileUrl")) { name = json_toString(item); strncpy(result.fileUrl, name, EVS_MAX_LOGAREA_LEN); } json_delete(item); } } json_delete(instance); } while(resp_data_len > 0); result.cmdId = 30; // 文件上传命令码为30 result.result = 10; // 成功 result.reason = 0; // 成功 memcpy(result.logQueryNo, req.logQueryNo, sizeof(req.logQueryNo)); // 失败 // send_event_NE_file_upload_result(&result); } __exit: if (fd >= 0) { close(fd); } if (session != RT_NULL) { webclient_close(session); } if (buffer != RT_NULL) { web_free(buffer); } if (header != RT_NULL) { web_free(header); } return rc; } ``` 8:过程打印 1)开始时候打印  2)结尾500的打印  目前上述的过程,传输的内容都一样,但是就是使用demo里面的方式,就能够正常返回200.但是使用自己拼装的函数,就出现了返回500的情况。有没有遇到类似的问题的?
查看更多
2
个回答
默认排序
按发布时间排序
wuguifang
2024-02-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考
有试过了,不知道为什么开启tcpdump的时候,再去调用Web_post_test,原本能够正常使用的,也不能正常。感觉可能tcpdump有做网口调用还是什么的。到之后后面socket要调用网口,也不能够正常使用了。 1:开启tcpdump的时候  2:不开启tcpdump的时候 
xiaorui
认证专家
2024-02-20
小睿手办 https://item.taobao.com/item.htm?id=674889867009
可以抓下网络包,对比下差异。
撰写答案
登录
注册新账号
关注者
0
被浏览
481
关于作者
wuguifang
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考
提问
24
回答
16
被采纳
0
关注TA
发私信
相关问题
1
AT组件连接BC26并使用Webclient软件包GET方式请求失败
2
webclient sal_sock每次send 内存就多占几十字 咋排查
3
webclient使用疑惑 ,post上传数据无效,get下载数据
4
w5500通信不稳定。
5
webclient软件包get接口,等不到response header?
6
webclient使用的建議
7
基于官方 webclient 的 http client
8
stm32使用webclient+mbedtls实现get请求及post太慢
9
Webclient无法下载局域网内的文件
10
webclient的post file的sample,需开启哪个文件系统支持
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread CI编译产物artifacts自动上传功能介绍
2
STM32G030移植RT-Thread
3
CubeMX & RT-Thread Studio 联合开发说明
4
RT-Thread动态模块
5
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
lchnu
3
个答案
2
次被采纳
张世争
1
个答案
2
次被采纳
a1012112796
9
个答案
1
次被采纳
三世执戟
8
个答案
1
次被采纳
聚散无由
5
个答案
1
次被采纳
本月文章贡献
jinchanchan
10
篇文章
13
次点赞
ssdd45555
3
篇文章
2
次点赞
聚散无由
1
篇文章
4
次点赞
RTT_逍遥
1
篇文章
3
次点赞
hywing
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部