使用百度的车牌识别 在第一次获取token后 再次发送图片会提示服务器连接超时。导致无法上网
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)
{
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, header);
request.setUrl(QUrl(url));
QNetworkReply *reply = manage->post(request, data.toUtf8());
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
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的对象
//设置请求头
httpPart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant(QString("form-data;name=\"%1\"").arg(name)));
//设置请求体
httpPart.setBody(body);
return httpPart;
/* 封装效果如下,封装请求数据包里的请求实体:
Content-Disposition: form-data; name="text"
body
*/
}