查看完整版本: [-- Qt4.8 如何组建正确HTTP post请求数据包? --]

QTCN开发网 -> Qt基础编程 -> Qt4.8 如何组建正确HTTP post请求数据包? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

misgn 2016-07-13 13:32

Qt4.8 如何组建正确HTTP post请求数据包?


先把自己的问题写出来。
首先源码是这个:
   manager = new QNetworkAccessManager();
   QByteArray dataByteArray("{\"grant_type\":\"authorization_code\",\"client_id\":\"32u2w95f20D4d27\",\"client_secret\":\"37vH35Eg028PHZz\",\"redirect_uri\":\"http://www.163.com\",\"code\":\"43c1c3e437e5542025936277d050b4\"}");//在这里填写JSON的原始数据,按照JSON的格式来写。
    QUrl url("http://kk.bigk2.com:8080/KOAuthDemeter/accessToken");
    QNetworkRequest request(url);
     //设置头部有关信息
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    request.setHeader(QNetworkRequest::ContentLengthHeader,dataByteArray.size ());

    manager->post(request,dataByteArray);

难道还需要配置什么?
为什么使用Fiddler抓不到包呢?难道是因为发送的HTTP数据包不符合格式而丢弃或不处理。那怎么按什么样的格式发送HTTP请求呢?

江南烟雨梦 2016-07-13 15:58
if ( m_pNetworkManager == NULL ) return false;
    QNetworkRequest    networkRequest;
    networkRequest.setUrl( QUrl( WEB_URL + strUrl ) );
    networkRequest.setHeader( QNetworkRequest::ContentTypeHeader, QVariant( "application/json" ) );
    if ( !m_pUser->m_strToken.isEmpty() )
        networkRequest.setRawHeader( QByteArray( "Auth-Token" ), m_pUser->m_strToken.toUtf8() );
    networkRequest.setRawHeader( QByteArray( "Client-Version" ), QByteArray( "1" ) );

    QNetworkReply *pReply = m_pNetworkManager->post( networkRequest, strJson.toUtf8() );
    SyncHttp();
    if ( pReply == NULL || QNetworkReply::NoError != pReply->error() )
    {
        qDebug() << pReply->errorString();
        m_strError = pReply->readAll().data();
        return QString( "" );
    }

    //返回的数据
    QString strR = pReply->readAll().data();
    pReply->deleteLater();
    return strR;

江南烟雨梦 2016-07-13 16:00
其中SyncHttp是自定义的函数,用来同步阻塞等待post返回结果。

misgn 2016-07-13 18:23
江南烟雨梦:其中SyncHttp是自定义的函数,用来同步阻塞等待post返回结果。 (2016-07-13 16:00) 

感谢江南的回复,现在在发现。原来是服务器接受的格式是form的格式。

misgn 2016-07-13 18:25
江南烟雨梦:if ( m_pNetworkManager == NULL ) return false;
    QNetworkRequest    networkRequest;
    networkRequest.setUrl( QUrl( WEB_URL + strUrl ) );
    networkRequest.setHeader( QNetworkR .. (2016-07-13 15:58) 

一个新的问题,请教一下。
setHeader和setRawHeader的区别在哪里?虽然文档上有介绍。但是有些模糊。

只知道setHeader设置的HTTP数据包的原始头部。
但setRawHeader中的Raw不也是原始的意思吗?

江南烟雨梦 2016-07-13 21:50
setHeader用于设置标准的HTTP头,setRawHeader用于设置自定义的HTTP头,我是这样理解的。
我上面的例子中,Auth-Token和Client-Version就是我自定义的HTTP头。

misgn 2016-07-14 09:31
江南烟雨梦:setHeader用于设置标准的HTTP头,setRawHeader用于设置自定义的HTTP头,我是这样理解的。
我上面的例子中,Auth-Token和Client-Version就是我自定义的HTTP头。 (2016-07-13 21:50) 

是不是所需要设置的头部类型,没有在枚举QNetworkRequest::KnownHeaders中,此时就需要使用setRawHeader来设置自定义的头部信息。反之则使用setHeader。

misgn 2016-07-14 09:32
江南烟雨梦:setHeader用于设置标准的HTTP头,setRawHeader用于设置自定义的HTTP头,我是这样理解的。
我上面的例子中,Auth-Token和Client-Version就是我自定义的HTTP头。 (2016-07-13 21:50) 

在setRawHeader函数中的“If headerName corresponds to a known header (see QNetworkRequest::KnownHeaders),the raw format will be parsed and the corresponding ’cooked‘ header will be set as well.”
这就话你是怎么理解的,我的理解是“如果头部名称和一个已知头部(该头部包含于枚举QNetworkRequest::KnownHeaders中),如果原始格式会被解析对应的产生‘cooked’头部的设置”。
E文水平有限。

江南烟雨梦 2016-07-19 16:57
misgn:在setRawHeader函数中的“If headerName corresponds to a known header (see QNetworkRequest::KnownHeaders),the raw format will be parsed and the corresponding ’cooked‘ header will be set as well.”
这就话你是怎么理解的,我的理解是“如果头部名称和一个已知头部( .. (2016-07-14 09:32) 

我的理解:如果头部名称对应一个已知头,那么原始格式将会被解析,同时也会设置对应的'cooked'头部。

misgn 2016-07-21 14:07
江南烟雨梦:我的理解:如果头部名称对应一个已知头,那么原始格式将会被解析,同时也会设置对应的'cooked'头部。 (2016-07-19 16:57) 

哦,谢谢啦。

杯水情 2021-01-28 12:32
学习了


查看完整版本: [-- Qt4.8 如何组建正确HTTP post请求数据包? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled