• 10020阅读
  • 10回复

[提问]Qt4.8 如何组建正确HTTP post请求数据包? [复制链接]

上一主题 下一主题
离线misgn
 

只看楼主 倒序阅读 楼主  发表于: 2016-07-13
回复本帖可获得1RMB金钱奖励!
每人最多可获奖2次,奖池剩余2RMB金钱 (中奖几率20%)
关键词: Qt4.8httppost

先把自己的问题写出来。
首先源码是这个:
   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请求呢?

只看该作者 1楼 发表于: 2016-07-13
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;

只看该作者 2楼 发表于: 2016-07-13
其中SyncHttp是自定义的函数,用来同步阻塞等待post返回结果。
离线misgn

只看该作者 3楼 发表于: 2016-07-13
回 江南烟雨梦 的帖子
江南烟雨梦:其中SyncHttp是自定义的函数,用来同步阻塞等待post返回结果。 (2016-07-13 16:00) 

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

只看该作者 4楼 发表于: 2016-07-13
回 江南烟雨梦 的帖子
江南烟雨梦: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不也是原始的意思吗?

只看该作者 5楼 发表于: 2016-07-13
回帖奖励+ 1
setHeader用于设置标准的HTTP头,setRawHeader用于设置自定义的HTTP头,我是这样理解的。
我上面的例子中,Auth-Token和Client-Version就是我自定义的HTTP头。
离线misgn

只看该作者 6楼 发表于: 2016-07-14
回 江南烟雨梦 的帖子
江南烟雨梦:setHeader用于设置标准的HTTP头,setRawHeader用于设置自定义的HTTP头,我是这样理解的。
我上面的例子中,Auth-Token和Client-Version就是我自定义的HTTP头。 (2016-07-13 21:50) 

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

只看该作者 7楼 发表于: 2016-07-14
回 江南烟雨梦 的帖子
江南烟雨梦: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文水平有限。

只看该作者 8楼 发表于: 2016-07-19
回 misgn 的帖子
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

只看该作者 9楼 发表于: 2016-07-21
回 江南烟雨梦 的帖子
江南烟雨梦:我的理解:如果头部名称对应一个已知头,那么原始格式将会被解析,同时也会设置对应的'cooked'头部。 (2016-07-19 16:57) 

哦,谢谢啦。
离线杯水情

只看该作者 10楼 发表于: 2021-01-28
学习了
快速回复
限100 字节
 
上一个 下一个