使用Qt5通过HTTPS连接使用JSON数据进行POST请求

时间:2015-04-16 11:32:31

标签: json post request qt5

我正在尝试通过Qt5通过HTTPS连接向Web-API发送POST请求,但我不断收到以下错误消息:

  

失败“下载https://.../login时出错 - 服务器回答:BAD REQUEST”

     

答复:"{"error_tag": "ARGUMENT_MISSING", "error_code": 19, "error_extra": {"argument": "email"}, "error": "Required argument is missing"}"

似乎HTTPS连接有效,但POST请求有问题......

    void connection::sendLoginData(){
        QUrl url = QString("https://.../login");
        QNetworkRequest req(url);
//Creating the JSON-Data
        QJsonDocument json;
        QJsonObject data;

        data["email"] = QString("a@g.com");
        data["password"] = QString("---");

        json.setObject(data);
        QByteArray jsonPost = QJsonDocument(data).toJson();

        req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json; charset=utf-8"));
        req.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(jsonPost.size()));

//Sending the Request
        QNetworkReply *reply = manager->post(req,jsonPost);

    // Connection via HTTPS
        QFile certFile(SSLCERTIFICATE);
        certFile.open(QIODevice::ReadOnly);
        QSslCertificate cert(&certFile, QSsl::Pem);
        QSslSocket * sslSocket = new QSslSocket(this);
        sslSocket->addCaCertificate(cert);
        QSslConfiguration configuration = sslSocket->sslConfiguration();
        configuration.setProtocol(QSsl::TlsV1_2);

        sslSocket->setSslConfiguration(configuration);
        reply->setSslConfiguration(configuration);

    }

这是在QNetworkReply获得回复时调用的Slot:

void connection::onFinished(QNetworkReply *reply){
    if (reply->error() == QNetworkReply::NoError) {
        //success
        qDebug() << "Success" <<reply->readAll();
        delete reply;
    }
    else {
        //failure
        qDebug() << "Failure" <<reply->errorString();
        qDebug() << "Reply: " << reply->readAll();
        delete reply;
    }
}

QNetworkReply的“完成”信号当然连接到“onFinished”-Slot

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    manager = new QNetworkAccessManager;
    ui->setupUi(this);
    Connector = new connection(ui,manager);
connect(manager,SIGNAL(finished(QNetworkReply*)),Connector,SLOT(onFinished(QNetworkReply*)));

}

也许有人能告诉我POST请求有什么问题?看看服务器的回复,似乎JSON-Data从未被发送过,或者以某种方式以错误的方式格式化......

1 个答案:

答案 0 :(得分:0)

由于您没有提供确切的网址,我建议您尝试检查SimpleWorkflowFullAccess和网址。import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

我刚遇到问题,代码在Qt 4.8中工作正常,但在Qt 5.4中,我的所有POST请求都收到400 Bad Request回复。 我通过Wireshark查看了TCP转储,发现URL错误。 在我的情况下url.isValid()是导致问题的那一行。应该是errorString()

希望它有所帮助。