QT学习总结--http发送接收json数据

zhy

发布于 2020.03.25 21:17 阅读 3064 评论 0

   最近两天做了一个qt为客户端,发送json数据到java的练习,期间出现了一些问题,做个总结。

  

  先看一下实现代码:

 

qt端:

 

   实现步骤很简单:

1. 绑定 QNetworkAccessManager 的finished信号与槽函数

2. 设置请求地址

3. 设置请求头(setHeader或者setRawHeader函数)

4. 发送信息(post函数)

 

void MainWindow::on_loginButton_clicked()
{
    //请求地址
    QUrl url("http://127.0.0.1:8080/qt/test/login2");
    QNetworkRequest request(url);
    //设置请求头
    request.setRawHeader("Accept","*/*");
    request.setRawHeader("Connection","keep-alive");
    request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36");
    request.setRawHeader("Content-Type", "application/json;charset=utf-8");
    //组装JSON数据
    QJsonObject login_json;
    login_json.insert("name", "123456");
    login_json.insert("password", "password");
    QJsonDocument doc;
    doc.setObject(login_json);
//    请求头content-type为application/x-www-form-urlencoded时,采用下面的格式
//    QString info = "name=123456&password=password";
//    QByteArray postData = info.toLocal8Bit();
    
    QByteArray postData = doc.toJson(QJsonDocument::Compact);
    //发送json
    reply = networkAccessManager->post(request,postData);

    postData.clear();
}

//处理返回的数据
void MainWindow::readInfo(QNetworkReply* reply){
    if (reply->error() == QNetworkReply::NoError)
        {
            // 获取响应信息
            QByteArray bytes = reply->readAll();      //读取所有字节;

            QJsonParseError jsonError;
            //转化为JSON文档
            QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
            // 解析Json  error
            if (doucment.isObject()) {
                QJsonObject obj = doucment.object();
                qDebug() << obj;

                QJsonValue val;
                QJsonValue data_value;
                if (obj.contains("name")) {
                    QString name= obj.value("name").toString();
                    qDebug() << tr("打印name");
                    qDebug() << name;
                }
                if (obj.contains("password")) {
                    val = obj.value("password");
                    if ((val.toString()) == "password") {
                        QMessageBox::information(this, "成功","登陆成功!");
                    }
                }
            }
            if (jsonError.error != QJsonParseError::NoError) {
                qDebug() << QStringLiteral("解析Json失败");
                //return;
            }
        }
        else
        {
            QMessageBox::information(this, "警告","登陆失败!");
            qDebug()<<"handle errors here" ;
            QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            //输出错误状态码
            qDebug( "found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
            //错误信息
            qDebug(qPrintable(reply->errorString()));
        }

        reply->deleteLater();
}

 

java端代码:

 

@RestController
@SuppressWarnings("SpringJavaAutowiringInspection")
@RequestMapping(value = "/qt/test")
public class LogInController2 {
//    请求头content-type为x-www-form-urlencoded时使用
//    @PostMapping(value = "/login2")
//    public User login2(@RequestParam(required = false,defaultValue = "name") String name,
//                       @RequestParam(required = false,defaultValue = "password") String password){
//
//        System.out.println(name + password);
//
//        return new User(name,password);
//    }
    

    //请求头content-type为application/json时使用
    @PostMapping(value = "/login2")
    public User login2(@RequestBody User user){

        System.out.println(user.getName()+user.getPassword());
        return user;
    }

}

 

    在练习中遇到的主要问题(请求头的content-type,请求格式与spring注解的冲突):

 

   1. 400出现的原因是使用了@RequiredParam,前端发送的数据与实体类不一致导致无法封装。

   2. 415出现的原因是使用了@RequestBody,content-type或请求格式不是json导致。

 

    整理一个表格如下: