QT:Http Post

#include "widget.h"

#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setScaledContents(true);
    m_url="https://api-cn.faceplusplus.com/facepp/v3/detect";
    m_apiKey="7kfC4-FHzEAIAJAebnnZT3YDSLfr7tiv";
//    m_apiKey="api_key=ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W";
    m_apiSecret="dWiiaWo2-n05KeAaCRPxsvjRvyZAVSrK";
//    m_apiSecret="api_secret=hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N";
    m_filePath="./1.jpg";
    m_requestStr1="return_landmark=1";
    m_requestStr1Ps="return_attributes=gender,age";
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_pushButton_clicked()
{
    ui->textBrowser->clear();
    ui->label->setPixmap(QPixmap(m_filePath));
    QFile file(m_filePath);
    file.open(QIODevice::ReadOnly);
    int file_len = file.size();
    QDataStream in(&file);
    char *m_buf = new char[file_len];
    in.readRawData(m_buf, file_len);
    file.close();
    QByteArray arr = QByteArray(m_buf, file_len);
    QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    // 发送https请求前准备工作;
//    QSslConfiguration config;
    QSslConfiguration conf = QSslConfiguration::defaultConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    conf.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(conf);
    request.setUrl(QUrl(m_url));
    QByteArray boundaryStr=getBoundary();
    request.setRawHeader("Content-Type", "multipart/form-data; boundary="+boundaryStr);
//同上request.setHeader(QNetworkRequest::ContentTypeHeader,"multipart/form-data; boundary="+boundaryStr);//同样可行
//    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded;charset=utf-8");
//    request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0");
//    request.setRawHeader("Connection","keep-alive");
//    request.setRawHeader("Host","api-cn.faceplusplus.com");
    //方式一:QHttpMultiPart
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    multiPart->setBoundary(boundaryStr);
    QHttpPart key;
//    key.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
    key.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\""));
    key.setBody("ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W");
    QHttpPart secret;
    secret.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_secret\""));
    secret.setBody("hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N");
    QHttpPart imagePart;
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image_base64\""));
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")/*QVariant("image/jpeg")*/);
    imagePart.setBody(arr.toBase64());
    imagePart.setBodyDevice(0);
    QHttpPart landmark;
    landmark.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"return_landmark\""));
    landmark.setBody("1");
    QHttpPart landmarktips;
    landmarktips.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"return_attributes\""));
    landmarktips.setBody("gender,age");
    multiPart->append(key);
    multiPart->append(secret);
    multiPart->append(imagePart);
    multiPart->append(landmark);
    multiPart->append(landmarktips);
    //方式二:拼串
    QByteArray array;
//    array.append("Content-Type:multipart/form-data; boundary="+boundaryStr/*分割串*/);
    array.append("--"+boundaryStr+"\r\n");
    array.append("Content-Disposition: form-data; name=\"api_key\"\r\n\r\n");
    array.append("ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W\r\n");
    array.append("--"+boundaryStr+"\r\n");
    array.append("Content-Disposition: form-data; name=\"api_secret\"\r\n\r\n");
    array.append("hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N\r\n");
    array.append("--"+boundaryStr+"\r\n");
    array.append("Content-Disposition: form-data; name=\"image_base64\"\r\nContent-Type:application/octet-stream\r\n\r\n");
//同上array.append("Content-Disposition: form-data; name=\"image_url\"\r\n\r\nhttps://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=581947021,421537588&fm=27&gp=0.jpg\r\n");
    array.append(arr.toBase64()+"\r\n");
    array.append("--"+boundaryStr+"\r\n");
    array.append("Content-Disposition: form-data; name=\"return_landmark\"\r\n\r\n1\r\n");
    array.append("--"+boundaryStr+"\r\n");
    array.append("Content-Disposition: form-data; name=\"return_attributes\"\r\n\r\nemotion\r\n");
    array.append("--"+boundaryStr+"--\r\n\r\n");//"--"important tail
//    qDebug()<<array;
    QNetworkReply *pReply = pManager->post(request,array/*multiPart*/);
    connect(pReply , SIGNAL(finished()) , this , SLOT(onFinished()));
    connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError(QNetworkReply::NetworkError)));
}
// 请求完成;
void Widget::onFinished()
{
    qDebug()<<"successd";
    QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
    // 保存接受的数据;
    QByteArray replyContent = pReplay->readAll();
    ui->textBrowser->append(QString(replyContent));
    pReplay->deleteLater();
}
// 请求失败;
void Widget::onError(QNetworkReply::NetworkError errorCode)
{
    QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
    // 输出错误码及错误信息;
    qDebug()<< errorCode;
    qDebug()<< pReplay->errorString();
    ui->textBrowser->append(pReplay->errorString());
    pReplay->deleteLater();
}
QByteArray Widget::getBoundary(){
    QByteArray sb;
    QByteArray tmp("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-");
    for(int i = 0; i < 32; ++i) {
        sb.append(tmp.at(qrand()%tmp.count()));
    }
//    sb.append("\r\n");
//    int nnn=QDateTime::currentDateTime().toTime_t()*1000;
//    QString n=QString::number(nnn,16);
    qDebug()<<sb;
    qDebug()<<sb.size();
    return sb;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值