记一次HTTP返回400的错误

本文记录了一次遇到HTTP 400错误的经历,分析了问题在于POST请求的数据未在http body中以及Content-Length字段不正确。解决方案包括将请求转换为标准POST请求,并修正Content-Length的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在一次访问后台中,服务器总是返回400,通过wireshark抓包显示如下:

POST/shsys-web/cc/module/v3/sub/sync?seq=37670&id=0077a33dbbd6a5839713&sn=15414b2300793583&d=aqeGAnlrIzg=HTTP/1.1

Host: 103.255.94.178:8080

Content-Length:12

User-Agent: Apache-HttpClient/UNAVAILABLE(java 1.4)

 

 

HTTP/1.1 400 Bad Request

Date: Tue, 13 Mar 2018 01:15:53 GMT

Content-Length: 226

Connection: close

Content-Type: text/html; charset=iso-8859-1

 

 

<!DOCTYPE HTML PUBLIC "-//IETF//DTDHTML 2.0//EN">

<html><head>

<title>400 Bad Request</title>

</head><body>

<h1>Bad Request</h1>

<p>Your browser sent a request thatthis server could not understand.<br />

</p>

</body></html>

后来经过查询,这段访问的问题是有两个:

(1)      作为POST请求,数据应该带载http body里面,这是其一

(2)      最主要的是,Content-Length这个字段是12,但是实际body里面没有内容,这是造成400的主要原因。

解决方法:

(1)      将请求换成标准的POST请求

POSThttp://openshsit.suning.com/shsys-web/cc/module/v3/sub/sync HTTP/1.1

Accept-Encoding: gzip,deflate

Content-Type:application/x-www-form-urlencoded

Content-Length: 436

Host: openshsit.suning.com

Proxy-Connection: Keep-Alive

User-Agent: Apache-HttpClient/4.1.1 (java1.5)

 

 

seq=12269&id=0077a33dbbd6a5839713&sn=0bd981ffc976907b&d=86EY16diTBI8aiYVcCH6JuPrTYEWqsuwNP%2BPsyBdpVdchHH%2BxSBb8ybG79E8cv3YtLNIPVW%2FsRcg0R5j4tc8WakBNgw4LyoWWnsK5v9JH1S2C13JaNpbflBv2rVWnfoNALfqY8d9j737TJWIik7uf5I7AAw0brqcmeRPK86VWz1MCxtNgJSYqp4r%2FnaJeZF8YX191FqQym1ivBb2F94jrV7YUsnHduOwm0HwDxfFN8o5hrHT0IBMJuFxLz1V4BjDM3kSIcIA3mN5Uav78zt9e70AfKYOP3RUOp0j1JK%2Fm8GEBeP%2BKuBF49QZkRutLeXxsU4qELX0vg0GT7sGzpOYCfEIfFkbIqy0r%2BOHzygqUzY%3D

 

(2)如果只是单纯的为了方便,直接将Content-Length这个值修改为0就OK了,可以绕过服务器的错误



QtModbus是一个用于Qt环境下的Modbus协议库,它允许开发者在应用程序中集成Modbus功能,如读取和写入设备的数据。当遇到写入错误的情况时,QtModbus通常会抛出异常或者返回错误码,这表示尝试写入的数据未能成功送达或者不符合Modbus规范。 在这种情况下,处理过程可能会包括以下几个步骤: 1. **捕获异常**:你需要在调用写操作的代码块中加入异常处理机制,比如`try-catch`结构,以便在发生WriteException异常时能够捕捉到。 ```cpp try { // 调用写入数据的操作 device.writeRegister(registers, quantity); } catch (const ModbusException &e) { qCritical() << "Write error: " << e.what(); } ``` 2. **检查错误**:检查异常信息,了解是什么导致了错误,可能是地址无效、寄存器忙或其他Modbus通信问题。 3. **录日志**:录下异常详情,以便后续分析问题。 4. **重试策略**:根据应用需求,可以选择简单地再次尝试写入,或者添加延时、次数限制等更复杂的重试逻辑。例如: ```cpp int retryCount = 0; while (retryCount < MAX_RETRIES) { try { device.writeRegister(registers, quantity); break; // 如果写入成功则退出循环 } catch (const ModbusException &e) { qWarning() << "Retrying write... (attempt " << retryCount + 1 << ")"; retryCount++; if (retryCount == MAX_RETRIES) { qCritical() << "Failed to write after retries, giving up."; } sleep(1); // 暂停一段时间后再试 } } ``` 5. **通知用户**:如果是用户界面应用,可以提供反馈给用户,说明写入失败并可能建议他们检查设备连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值