1

我正在尝试使用 QT 框架运行多查询。我的查询看起来像这样

{"query1":"SELECT uid2 FROM friend WHERE uid1=me()","query2":"SELECT uid, name FROM user WHERE uid in(SELECT uid2 FROM #query1)"}

到目前为止,我发现如果不使用“#query1”方法它会起作用。但我在我的应用程序中需要它,因为我的实际查询更复杂。

如果我粘贴

https://api.facebook.com/method/fql.multiquery?format=json&queries=%7B%22query1%22%3A%22SELECT%20uid2%20FROM%20friend%20WHERE%20uid1%3Dme%28%29%22%2C%22query2%22%3A%22SELECT%20uid%2C%20name%20FROM%20user%20WHERE%20uid%20in%28SELECT%20uid2%20FROM%20%23query1%29%22%7D&access_token=xxxxxxxxxxxxx

在浏览器的地址栏中,access_token 是有效的,我得到了回应。

当我从 QT 发出相同的请求时,我得到一个空的 json 列表(“[]”)

这是QT代码:

//this is just a markup, the read deal works

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;

url="https://api.facebook.com/method/fql.multiquery?format=json&queries=%7B%22query1%22%3A%22SELECT%20uid2%20FROM%20friend%20WHERE%20uid1%3Dme%28%29%22%2C%22query2%22%3A%22SELECT%20uid%2C%20name%20FROM%20user%20WHERE%20uid%20in%28SELECT%20uid2%20FROM%20%23query1%29%22%7D&access_token=xxxxxxxxxxxxx";

request.setRawHeader("Content-Type","application/x-www-form-urlencoded");

request.setUrl(url);

reply=manager->get(request);
connect(manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));


void replyFinished(QNetworkReply *r){

qDebug()<<r->readAll();

}

这当前输出“[]”。如果我使用一个简单的网址,例如

http://graph.facebook.com/me/friends?access_token=xxxxxxxxx

它工作得很好。

  • 那么我错过了什么?

  • 是不是因为我的浏览器的get请求和我的QT get请求有区别?

  • 我是否必须配置我的 HTTP 获取请求的标头?如果是这样,价值是什么

先感谢您

4

1 回答 1

0

URL 已经编码,您应该使用QUrl::setEncodedUrl()它来设置它,或者让它QUrl为您编码:

url = "https://api.facebook.com/method/fql.multiquery?format=json&queries={\"query1\":\"SELECT uid2 FROM friend WHERE uid1=me()\",\"query2\":\"SELECT uid, name FROM user WHERE uid in(SELECT uid2 FROM #query1)\"}&access_token=xxxxxxxxxxxxx";  
于 2012-03-24T01:32:27.500 回答