#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();// 创建一个QJsonArrayQJsonArray jsonArray;jsonArray.append(0);jsonArray.append(1);jsonArray.append(2);//传入josnQJsonObject 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
。