
在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()<
error(); - }
-
- // 获取http状态码
- QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- qDebug()<<"状态码:"<
-
- //解析返回的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()<
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()<
-
- //发送请求
- 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()<<"状态码:"<
- //解析返回的Json结果
- QByteArray replyData = reply->readAll();
- QJsonParseError json_error;
- QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
- if(json_error.error != QJsonParseError::NoError)
- {
- qDebug()<
- }
- QJsonObject rootObj = jsonDoc.object();
- QJsonValue val = rootObj.value("code");//返回的代码,因为是double类型的所以不能转换成QString
在post里面要注意,有的参数需要提交,需要借助QJsonObject转变成 QByteArray。需要注意数据格式的问题,比如数组要转换成json的格式,毕竟C++和java是两种语言。另外,如果要在QT里面使用上述代码,还要记得包含以下的头文件,不然会报错:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
另外,在 Qt 库中,QJsonValue 实际上可以是一种通用的 JSON 数据类型,包括数组和对象。因此,将 QJsonValue 转换为 QJsonArray 并不总是一个明确的过程。然而,如果你确定该 QJsonValue 实际上是一个 JSON 数组,那么可以使用 QJsonValue::toArray() 方法将其转换为 QJsonArray。
QT通过http的post上传带有参数的文件到指定网址。
实现代码如下:
- 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;
-
相关阅读:
认识电磁干扰?|深圳比创达EMC
【牛客网刷题】中秋节前开启java专项练习错题总结第一天
Java 重写、重载,这篇文章看了就明白
MySQL高级
Acwing 1169. 糖果
提升品牌形象:利用OLED透明拼接屏进行品牌展示
【C++学习】基础1
论文阅读——EarthPT
省钱兄情侣飞行棋小程序会让爱情在游戏中更加美妙
隐式类型转换(整形提升)
-
原文地址:https://blog.csdn.net/Helloorld_1/article/details/133925786