我创建了一个反馈记者,它将一些信息发送给服务器。
这是发件人部分:
QUrl url;
url.setUrl("http://myprettyURL/server.php");
QNetworkRequest request(url);
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QByteArray content = "Some very long content (60Ko)";
manager->post(request, content);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onSyncRequestFinished(QNetworkReply*)));
这是服务器部分:
$i = 0
foreach($_POST as $post){
file_put_contents( $submission_dir . "/log" . $i , $post);
$i++;
}
发件人发送60Ko文本(很多文本,但不是重数据),但只发送1Ko。
Qt抛出以下错误:
qhttpnetworkrequest.cpp static QByteArray QHttpNetworkRequestPrivate :: header(const QHttpNetworkRequest&,bool)@ 164内容类型在HTTP POST中丢失,默认为application / x-www-form-urlencoded。使用QNetworkRequest :: setHeader()来解决此问题。
所以我加入了这一行:
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
已经过测试application/x-www-form-urlencoded
multipart/form-data
和text/plain
但没有效果。
post_max_size
设置为32Mo所以我不认为它来自这里。
答案 0 :(得分:1)
所有这些内容类型都要求在发送数据之前对数据进行编码! text/plain
内容类型是最简单的,只要您实际发送文本而不是二进制数据。
要发送纯文本,您必须将其放在QString
中,然后将其编码为utf-8
,最后将内容类型相应地设置为text/html; charset=utf-8
。
因此:
QString text(QStringLiteral("foo"));
QByteArray const data = text.toUtf8();
QNetworkRequest request(QUrl(QStringLiteral("http://myprettyURL/server.php")));
request.setHeader(QNetworkRequest::ContentTypeHeader,
QStringLiteral("text/html; charset=utf-8"));
manager->post(request, data);
答案 1 :(得分:0)
问题来自发送的数据:我发送的字符被解释为=
或&
等查询。
我只是使用以下方法将其从字符串中删除:
content.remove("[=|&]");
并且运作良好。