Java post请求字符串接收 java接收post请求json_#include


一、在PC Window(QT5版本)

1.1、构建URL


Java post请求字符串接收 java接收post请求json_post json后台处理数据_02


1.2、构建HTTP请求头

Java post请求字符串接收 java接收post请求json_post json后台处理数据_03


1.3、连接信号与操作,接收服务器回复的消息


Java post请求字符串接收 java接收post请求json_#include_04


槽函数这里我们要在头文件定义,然后把处理过程实现。


Java post请求字符串接收 java接收post请求json_post json后台处理数据_05


void MainWindow::replyFinished(QNetworkReply *reply)
{
    char recvbuffer[128] ;
    memset(recvbuffer,0,128);
    //1、获取响应状态码
    variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if (variant.isValid())
        qDebug() << variant.toInt();
    //2、获取响应头
    variant = reply->header(QNetworkRequest::ContentTypeHeader);
    if (variant.isValid())
        qDebug() << variant.toString();
    //3、获取响应信息
    QByteArray bytes = reply->readAll();
    qDebug() << bytes ;
    
    QJsonValue success_value ;
    QJsonValue message_value ;
    QJsonParseError jsonError;
    //转换为Json文档
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    //解析时没有发生错误
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    {
        if (doucment.isObject()) { // JSON 文档为对象
            {
                // 转化为对象
                QJsonObject object = doucment.object();
                // 包含指定的 key
                if (object.contains("success")) {
                    // 获取指定 key 对应的 value
                    success_value = object.value("success");
                    qDebug() << "success_value : " << success_value.toBool();
                }
                // 包含指定的 key
                if (object.contains("message")) {
                    // 获取指定 key 对应的 value
                    message_value = object.value("message");
                    qDebug() << "message_value : " << message_value.toString();
                }

            }
        }
    }

    if(true == success_value.toBool())
    {
        qDebug() << "数据上传成功";
    }
}


至于处理过程为什么要去JSON格式的数据,那是根据我的服务器给我返回的消息来进行处理的,其中最重要的是readAll得到的响应消息,服务器给我回复的是JSON格式的数据,所以我就要以JSON的格式去解析这个数据。那当然,如果你想玩,就跟AT指令一样,服务器回个OKrn给我也可以啊。。。哈哈哈,没毛病。

1.4、构造要发送的JSON数据


Java post请求字符串接收 java接收post请求json_post json后台处理数据_06


构造的结果就是===> "{"detail":"1","type":"2"}"

1.5、发送POST请求


Java post请求字符串接收 java接收post请求json_post json后台处理数据_07


源码实现如下:

mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <unistd.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // URL
    baseUrl = "http://120.78.136.134:9002/api/explosive/messages";
    QUrl url(baseUrl);

    // 构造Json数据
    json.insert("type", "2");
    json.insert("detail", "1");
    QJsonDocument document;
    document.setObject(json);
    dataArray = document.toJson(QJsonDocument::Compact);

    // 构造请求头
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setUrl(url);
    manager = new QNetworkAccessManager(this);
    // 连接信号槽
    connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));


    dataArray = "{"detail":"1","type":"2"}" ;
    qDebug() << dataArray ;
    // 发送请求
    manager->post(request, dataArray);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::replyFinished(QNetworkReply *reply)
{
    //1、获取响应状态码
    variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if (variant.isValid()){
        qDebug() << variant.toInt() ;
    }
    //2、获取响应头
    variant = reply->header(QNetworkRequest::ContentTypeHeader);
    if (variant.isValid())
        qDebug() << variant.toString();

    //3、获取响应信息
    QByteArray bytes = reply->readAll();
    qDebug() << bytes ;
    ui->textBrowser->append(bytes);

    QJsonValue success_value ;
    QJsonValue message_value ;
    QJsonParseError jsonError;
    //转换为Json文档
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    //解析时没有发生错误
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    {
        if (doucment.isObject()) { // JSON 文档为对象
            {
                // 转化为对象
                QJsonObject object = doucment.object();
                // 包含指定的 key
                if (object.contains("success")) {
                    // 获取指定 key 对应的 value
                    success_value = object.value("success");
                    qDebug() << "success_value : " << success_value.toBool();
                }
                // 包含指定的 key
                if (object.contains("message")) {
                    // 获取指定 key 对应的 value
                    message_value = object.value("message");
                    qDebug() << "message_value : " << message_value.toString();
                }

            }
        }
    }

    if(true == success_value.toBool())
    {
        qDebug() << "数据上传成功";
    }
}


mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>
#include <QDebug>
#include <QString>
#include <QVariant>
#include <QHttpMultiPart>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void replyFinished(QNetworkReply *reply);

private:
    Ui::MainWindow *ui;
    QString baseUrl ;
    QJsonObject json;
    QByteArray dataArray ;
    QNetworkRequest request;
    QNetworkAccessManager *manager ;
    QVariant variant ;
};

#endif // MAINWINDOW_H


1.6、在PC上的运行结果


Java post请求字符串接收 java接收post请求json_post json后台处理数据_08


数据成功上传。

二、在PC Linux下需要注意的地方

貌似没有QT JSON的库,所以一用到Json相关库的时候会报找不到当前头文件或者库的错。那也很简单,把上面所有JSON相关的操作函数以及头文件去掉,当我要构建一个JSON数据然后发起post请求的时候只需要:


QByteArray dataArray = "{"detail":"1","type":"2"}" ;
manager->post(request, dataArray);


这样跟JSON库做的方法是一样的,当然你可以百度去下第三方的JSON库,一样也可以实现。

将程序交叉编译后,在周立功的ARM A6G2C(imx6ul上运行)

mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>
#include <QDebug>
#include <QString>
#include <QVariant>
#include <QHttpMultiPart>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void replyFinished(QNetworkReply *reply);

private:
    Ui::MainWindow *ui;
    QString baseUrl ;
    //QJsonObject json;
    QByteArray dataArray ;
    QNetworkRequest request;
    QNetworkAccessManager *manager ;
    QVariant variant ;
};

#endif // MAINWINDOW_H


mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <unistd.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // URL
    baseUrl = "http://120.78.136.134:9002/api/explosive/messages";
    QUrl url(baseUrl);

    // 构造请求头 ===>  包括三个部分 请求方式(POST)、请求URL(baseUrl)、HTTP协议及版本(HTTP/1.1)
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setUrl(url);
    manager = new QNetworkAccessManager(this);
    // 连接信号槽
    connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
     构造Json数据
    dataArray = "{"detail":"1","type":"2"}" ;
    // 发送请求
    manager->post(request, dataArray);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::replyFinished(QNetworkReply *reply)
{
    char recvbuffer[128] ;
    memset(recvbuffer,0,128);
    //1、获取响应状态码
    variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if (variant.isValid()){
        sprintf(recvbuffer,"HTTP/1.1 %d OK",variant.toInt());
        qDebug() << recvbuffer ;
    }
    //2、获取响应头
    variant = reply->header(QNetworkRequest::ContentTypeHeader);
    if (variant.isValid())
        qDebug() << variant.toString();

    //3、获取响应信息
    QByteArray bytes = reply->readAll();
    qDebug() << bytes ;
    ui->textBrowser->append(bytes);
}


在周立功ARM平台上的运行结果,在执行程序之前需要做如下的操作:

拨号上网


Java post请求字符串接收 java接收post请求json_post json后台处理数据_09


查看ppp节点


Java post请求字符串接收 java接收post请求json_#include_10


测试网络连通性


Java post请求字符串接收 java接收post请求json_#include_11


执行HTTP测试程序


Java post请求字符串接收 java接收post请求json_#include_12


数据成功上传。