#1024程序员节|参与投稿,赢限定勋章和专属大奖#
#假如你有一台服务器,你最想做哪些事?#
#你被什么样的BUG困扰过一周以上?#
在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意,这些函数不是由编程语言实现的,而是由HTTP协议规定的。因此,无论使用哪种编程语言进行HTTP通信,都可以使用这些函数和响应代码进行发送和接收操作。
请求相关函数:
-
GET
:用于请求指定的资源。 -
POST
:用于向指定资源提交数据,请求服务器进行处理。 -
PUT
:用于更新指定资源的内容。 -
DELETE
:用于删除指定资源。 -
HEAD
:与GET方法类似,但不返回响应体,只获取HTTP头信息。 -
OPTIONS
:用于获取目标资源支持的通信选项。 -
CONNECT
:用于建立网络连接以供隧道传输。 -
TRACE
:用于进行消息回环测试。
响应相关函数:
-
200 OK
:表示成功响应,请求已成功被处理。 -
201 Created
:表示成功创建了新资源。 -
202 Accepted
:表示请求已被接受,继续处理。 -
204 No Content
:表示成功处理了请求,但无响应体内容。 -
301 Moved Permanently
:表示资源已被永久移动到新位置。 -
302 Found
:表示资源已被临时移动到新位置。 -
303 See Other
:表示由于其他位置的响应可能更适合,建议查看其他位置。 -
304 Not Modified
:表示请求的资源未被修改,客户端可继续使用缓存的版本。 -
400 Bad Request
:表示请求格式错误或请求无法被服务器理解。 -
401 Unauthorized
:表示请求需要身份验证,但未提供认证信息。 -
403 Forbidden
:表示请求被服务器拒绝,即使提供了认证信息也不允许访问。 -
404 Not Found
:表示请求的资源不存在。 -
500 Internal Server Error
:表示服务器内部错误,无法完成请求。 -
501 Not Implemented
:表示服务器不支持请求的方法。 -
502 Bad Gateway
:表示作为网关或代理服务器时,服务器从上游服务器接收到的响应是无效的。 -
503 Service Unavailable
:表示服务器暂时不可用,无法处理请求。
在这里用QT来演示一哈如何使用http协议,获取和传递信息:
具体代码如下所示:
使用QNetworkRequest来实现get
//生成对应的网络请求
QNetworkRequest request;
QString requestHeader = "http://你自己的网址";
QString fullRequest = requestHeader;
request.setUrl(QUrl(fullRequest));
//发送Get请求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(request);
QEventLoop eventLoop;//开启一个事件,当这个事件接收到完成的信号的时候,就结束循环
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
//对请求的返回异常进行处理
if(reply->error() != QNetworkReply::NoError)
{
qDebug()<<reply->error();
}
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug()<<"状态码:"<<statusCode;
//解析返回的Json结果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
qDebug()<< "error";
}
if(!jsonDoc.isNull()) {
if(jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
qDebug() << "code: " << code;
return uuid;
} else {
qDebug() << "Invalid JSON object";
}
} else {
qDebug() << "Failed to parse JSON";
}
使用QNetworkRequest来实现post功能
//生成对应的网址请求
QNetworkRequest request;
QString fullRequest = "http://你的网址";
request.setUrl(QUrl(fullRequest));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//因为QT和java的请求头不一致
request.setRawHeader(QByteArray("键"), "值");//这里是设置非标准的请求头
// 查看请求头
qDebug()<<request.rawHeaderList();
// 创建一个QJsonArray
QJsonArray jsonArray;
jsonArray.append(0);
jsonArray.append(1);
jsonArray.append(2);
//传入josn
QJsonObject object;
object.insert("1","");//
object.insert("test",jsonArray);//利用QJsonArray可以传入数组
object.insert("page",1);
QJsonDocument document;
document.setObject( object );
QByteArray array = document.toJson( QJsonDocument::Compact );
qDebug()<<object;
//发送请求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request,array);
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
if(reply->error() != QNetworkReply::NoError)
{
qDebug()<< reply->error();
}
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug()<<"状态码:"<<statusCode;
//解析返回的Json结果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
qDebug()<<json_error.error<<replyData;
}
QJsonObject rootObj = jsonDoc.object();
QJsonValue val = rootObj.value("code");//返回的代码,因为是double类型的所以不能转换成QString
在post里面要注意,有的参数需要提交,需要借助QJsonObject转变成 QByteArray。需要注意数据格式的问题,比如数组要转换成json的格式,毕竟C++和java是两种语言。另外,如果要在QT里面使用上述代码,还要记得包含以下的头文件,不然会报错:
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QTcpSocket>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QByteArray>
另外,在 Qt 库中,QJsonValue
实际上可以是一种通用的 JSON 数据类型,包括数组和对象。因此,将 QJsonValue
转换为 QJsonArray
并不总是一个明确的过程。然而,如果你确定该 QJsonValue
实际上是一个 JSON 数组,那么可以使用 QJsonValue::toArray()
方法将其转换为 QJsonArray
。
QT通过http的post上传带有参数的文件到指定网址。文章来源:https://www.toymoban.com/news/detail-722199.html
实现代码如下:文章来源地址https://www.toymoban.com/news/detail-722199.html
QString token="验证指令";
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);//定义multi的方式
// 创建一个QNetworkAccessManager对象,用于处理网络请求
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QString file_path="上传的文件路径";
QFileInfo info(file_path);
if(!info.isFile())
{
qDebug()<<"文件路径异常";
}
QFile *file = new QFile(file_path);
bool read=file->open(QIODevice::ReadOnly);
if(read)
{
qDebug()<<"4";
}
QString http="上传文件地址";
QString prodorderno,sort,code,filesort;
prodorderno="生产单号";
sort="类别";
code="代码编号";
filesort="文件顺序";
QString uploadFileName = file_path;//获取文件路径
qDebug()<<uploadFileName<<" "<<http;
// 创建一个QNetworkRequest对象,使用指定的URL
QNetworkRequest request(http);
// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/form-data");//就是这个地方,因为多写了这句代码,所以一直出错,无法解决
request.setRawHeader(QByteArray("Authorization"), token.toLatin1());//用于验证使用的token
//Post请求参数方法,一个参数为一个QHttpPart
QHttpPart filePart1;
filePart1.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
filePart1.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"code\""));
filePart1.setBody(code.toLatin1());
multiPart->append(filePart1);
QHttpPart filePart2;
filePart2.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
filePart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"fileSort\""));
filePart2.setBody(filesort.toLatin1());
multiPart->append(filePart2);
QHttpPart filePart3;
filePart3.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
filePart3.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"prodorderno\""));
filePart3.setBody(prodorderno.toLatin1());
multiPart->append(filePart3);
QHttpPart filePart4;
filePart4.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
filePart4.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"sort\""));
filePart4.setBody(sort.toLatin1());
multiPart->append(filePart4);
QHttpPart filePart5;
filePart5.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
QString header=QString("form-data; name=\"file\"; filename=\""+info.fileName()+"\"");//application/octet-stream
filePart5.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header));
filePart5.setBodyDevice(file);
file->setParent(multiPart);
multiPart->append(filePart5);
qDebug()<<QNetworkRequest::ContentTypeHeader;
//***********************************************************
// 创建一个QNetworkReply对象,用于接收上传的响应
QNetworkReply *reply = manager->post(request, multiPart);
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec();//QEventLoop::ExcludeUserInputEvents,不添加这个,是为了防止断网,软件卡死
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug()<<"状态码:"<<statusCode;
//解析返回的Json结果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
qDebug()<<json_error.error<<replyData;
}
QJsonObject rootObj = jsonDoc.object();
QString codeStr = rootObj.value("code").toString();
qDebug()<<rootObj;
到了这里,关于使用QT实现http里面的get和post的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!