如下代码使用Qt发起了一个简单的Http请求。请求开始前设置了Http的请求头。
auto netAM = new QNetworkAccessManager(this);
QString url{ "https://yourDomain.com" };
QNetworkRequest request(url);
QString userName{ "LiuLun" };
request.setRawHeader("UserName", userName.toUtf8());
QNetworkReply* reply = netAM->get(request);
connect(reply, &QNetworkReply::finished, this, &YorClass::onResponse);
Qt5.x会把开发者设置的请求头原封不动发给服务端。
Qt6.x会把请求头的name转换成小写,再发送给服务端。
也就是说,上述代码中的 "UserName" 变成了 "username"。请求头的值,不会改变。
到目前为止,我没找到任何办法禁止Qt这么做,只能找服务端开发人员,让它们适配一下。
根据 HTTP 协议来看,请求头确实是不区分大小写的,甚至应该默认统一为小写。
HTTP headers let the client and the server pass additional information with a message in a request or response. In HTTP/1.X, a header is a case-insensitive name followed by a colon, then optional whitespace which will be ignored, and finally by its value (for example: Allow: POST). In HTTP/2 and above, headers are displayed in lowercase when viewed in developer tools (accept: */*), and prefixed with a colon for a special group of pseudo-headers (:status: 200).
HTTP headers - HTTP | MDN
实际上Java后端是没问题的,Java在获取Http请求头时,是大小写不敏感的,下面三种方式都能获取到客户端传递来的值。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username1 = request.getHeader("username"); // OK
String username2 = request.getHeader("UserName"); // OK
String username3 = request.getHeader("USERNAME"); // OK
}
但 Python 的某些 Web 框架(比如 Flask)就是大小写敏感的,目前这个问题无解,只能找他们改代码。
这会带来很多与测试、发布周期相关的问题。
534

被折叠的 条评论
为什么被折叠?



