logo

qt 开线程用http上报没有连接到服务器

使用百度的车牌识别 在第一次获取token后 再次发送图片会提示服务器连接超时。导致无法上网

include “httpcar.h”

include

include

include

HttpCar::HttpCar(QObject parent) : QObject(parent)
{
startFlag = false;
apiKey = “NRWQ3zMVf5ol44tqLd9YIT1r”;
secretKey = “upbNMdGmWIIMqsOogX5Ft7C8wL2oXjHA”;
manage = new QNetworkAccessManager(this);
connect(manage, SIGNAL(finished(QNetworkReply
)), this, SLOT(dofinshedreplay(QNetworkReply*)));
getToken(apiKey,secretKey);
}
//发送post请求获取token
void HttpCar::getToken(const QString &client_id, const QString &client_secret)
{
qDebug()<<”get token”;
QStringList list; //存多个字符串
list.append(QString(“grant_type=%1”).arg(“client_credentials”));
list.append(QString(“client_id=%1”).arg(client_id));
list.append(QString(“client_secret=%1”).arg(client_secret));
QString data = list.join(“&”); //在每个字符串中插入一个&
QString url = “https://aip.baidubce.com/oauth/2.0/token“;
sendData(url, data);
}
void HttpCar::doSendthePhoto(QImage image)
{
// QList httpParts;
// httpParts << dataToHttpPart(token.toUtf8(), “access_token”);
// httpParts << dataToHttpPart(“application/x-www-form-urlencoded”, “Content-Type”);
// httpParts << dataToHttpPart(getImageData(image), “image”);
QString url = QString(“https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate“ + token);
QNetworkRequest myrequset;
myrequset.setUrl(QUrl(url));
myrequset.setHeader(QNetworkRequest::ContentTypeHeader, “application/x-www-form-urlencoded”);
QByteArray buf64 = getImageData(image);
QByteArray body =”image=”+buf64.toBase64().toPercentEncoding();
manage->post(myrequset,body);
//sendData(url, httpParts);
}

void HttpCar::sendData(const QString &url, const QString &data, const QString &header)
{

 
 
 
  1. QNetworkRequest request;
  2. request.setHeader(QNetworkRequest::ContentTypeHeader, header);
  3. request.setUrl(QUrl(url));
  4. QNetworkReply *reply = manage->post(request, data.toUtf8());
  5. QEventLoop eventLoop;
  6. QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
  7. eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

}
void HttpCar::sendData(const QString &url, const QList &httpParts)
{
//初始化消息体
qDebug() << “sendData”;
QHttpMultiPart httpMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
//逐个添加消息内容
foreach (QHttpPart httpPart, httpParts) {
httpMultiPart->append(httpPart);
}
//初始化请求对象
QNetworkRequest request;
request.setUrl(QUrl(url));
//发送请求
QNetworkReply
reply = manage->post(request, httpMultiPart);
httpMultiPart->setParent(reply); //现在还不能删除httpMultipart,让它随reply一起消亡,设置父对象是它即可
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
}

void HttpCar::dofinshedreplay(QNetworkReply *reply)
{
qDebug()<<”dofinshedreplay”;
if(reply->error() != QNetworkReply::NoError)
{
qDebug()<< reply->error();
return ;
}
else
{
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray res = reply->readAll();
JsonPare(res);
}
reply->close();
reply->abort();
reply->deleteLater();
}
void HttpCar:: JsonPare(QByteArray &data)
{
qDebug()<<”JsonPare”;
//1. 使用QJsonDocument读取json原始数据;
QJsonDocument doc = QJsonDocument::fromJson(data);
//2.使用QJSonObject获取json对象;
QJsonObject obj = doc.object();
//3.通过QJsonObject获取键值,并转成相应格式
if(startFlag == false){
token = obj[“access_token”].toString();
qDebug()<<token;
if(!token.isEmpty())
{
startFlag = true;
qDebug()<<”emit aaaa()”;
emit aaaa();
}
}else{
qDebug()<<data;
//把words_result从上述中解析出来
QJsonObject obj2 = obj.value(“words_result”).toObject(); //识别车牌
QString carNumber = obj2.value(“number”).toString();
QString carColor = obj2.value(“color”).toString();
qDebug()<<carNumber<<” “<< carColor;
}
}
QByteArray HttpCar::getImageData(const QImage &img)
{
//QImage image = img;
QByteArray imageData;
QBuffer buffer(&imageData);
img.save(&buffer, “jpg”);
return imageData.toBase64();
}
QHttpPart HttpCar::dataToHttpPart(const QByteArray &body, const QString &name)
{
QHttpPart httpPart; //定义类QHttpPart的对象

 
 
 
  1. //设置请求头
  2. httpPart.setHeader(QNetworkRequest::ContentDispositionHeader,
  3. QVariant(QString("form-data;name=\"%1\"").arg(name)));
  4. //设置请求体
  5. httpPart.setBody(body);
  6. return httpPart;
  7. /* 封装效果如下,封装请求数据包里的请求实体:
  8. Content-Disposition: form-data; name="text"
  9. body
  10. */

}

全部回答 · 1

  • 最新
  • 最热
暂无回答
暂无回答