bool HttpAgent::async(const QObject * receiver, const char * method, const QString& httpMethod, const Route& route, const QMap<QString, QVariant>& params, const QMap<QString, QString>& filePaths, const QMap<QString, QVariant>& argsToSlot, const QObject * downloadProgressReceiver, const char * downloadProgressMethod ) { //在路由里取出url规则 QString routePattern = route.pattern(); qDebug() << "Services::async():" << routePattern; //遍历所有"默认参数"(如:_format, _locale), 做替换 QMapIterator<QString, QVariant> defaultParamIterator(defaultParams); while ( defaultParamIterator.hasNext() ) { defaultParamIterator.next(); QString toReplace = QString("{") + defaultParamIterator.key() + QString("}"); routePattern.replace( toReplace, defaultParamIterator.value().toString() ); qDebug() << "Services::async():replace("<< defaultParamIterator.key() << "," << defaultParamIterator.value() << "):" << routePattern; } qDebug() << "Services::async():" << routePattern; //QString paramsString; QUrlQuery query; int paramCount = 0; QMapIterator<QString, QVariant> i(params); while ( i.hasNext() ) { i.next(); /*if ( paramCount > 0 ) { paramsString += "&"; } paramsString += i.key(); paramsString += '='; paramsString += i.value();*/ QString value = QString( QUrl::toPercentEncoding( i.value().toString(), "", "+" ) ); query.addQueryItem(i.key(), value); //replace if found in urlPattern QString toReplace = QString("{") + i.key() + QString("}"); routePattern.replace( toReplace, i.value().toString() ); paramCount++; } /*QString paramString = query.query(QUrl::FullyEncoded); QByteArray ba = QUrl::toPercentEncoding(paramString, "&=", "+"); qDebug() << "BA ==== " << ba;*/ qDebug() << "Services::async(): paramsString: \"" << query.query(QUrl::FullyEncoded) << "\""; //paramsString << "\""; QString host = !route.host().isEmpty() ? route.host() : defaultHost; QString url(defaultProtocol + "://" + host + routePattern); //req.setRawHeader(QByteArray("X-Requested-With"), QByteArray("XMLHttpRequest")); QMap<QString, QString> headers; headers[ "X-Requested-With" ] = "XMLHttpRequest"; return sendRequest(httpMethod, url, params, //query.query(QUrl::FullyEncoded), //paramsString, //"email="+loginName+"&password="+password, filePaths, headers, receiver, method, argsToSlot, downloadProgressReceiver, downloadProgressMethod ); }