最近两天做了一个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导致。
整理一个表格如下:
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}