Comment définir les propriétés QNetworkReply pour obtenir des pages NCBI correctes?
-
24-09-2019 - |
Question
J'essaie d'obtenir cette adresse suivante en utilisant la fonction downloadURL comme suit:
http://www.ncbi.nlm.nih.gov/nuccore/27884304
Mais les données ne sont pas aussi ce que nous pouvons voir à travers le navigateur, maintenant, je sais que c'est parce que certaines informations correctes (telles que le type de navigateur) est nécessaire. Comment puis-je savoir quel type d'information que je dois mettre, et comment puis-je le mettre? (Par fonction setHeader ou d'une autre manière ??)
Dans VC ++, nous pouvons utiliser CInternetSession et CHttpConnection objet pour obtenir les données correctes sans mettre toute autre information de détail, est-il un moyen similaire dans Qt ou autre multi-plateforme C ++ réseau lib ?? (Oui, j'ai besoin de la propriété multiplateforme.)
QNetworkReply::NetworkError downloadURL(const QUrl &url, QByteArray &data) {
QNetworkAccessManager manager;
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader ,"Mozilla/5.0 (Windows; U; Windows NT
6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)");
QNetworkReply *reply = manager.get(request);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QVariant statusCodeV = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
QUrl redirectTo = statusCodeV.toUrl();
if (!redirectTo.isEmpty())
{
if (redirectTo.host().isEmpty())
{
const QByteArray newaddr = ("http://"+url.host()+redirectTo.encodedPath()).toAscii();
redirectTo.setEncodedUrl(newaddr);
redirectTo.setHost(url.host());
}
return (downloadURL(redirectTo, data));
}
if (reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
data = reply->readAll();
delete reply;
return QNetworkReply::NoError; }
Par VC, nous pouvons juste faire cela, alors les données correctes est dans le CHttpFile.
CString downloadURL (CString sGetFromURL)
{
// create an internet session
CInternetSession csiSession;
int pos;
BOOL neof;
// parse URL to get server/object/port
DWORD dwServiceType;
CString sServerName;
CString sObject;
INTERNET_PORT nPort;
CHttpConnection* pHTTPServer = NULL;
CHttpFile* pFile = NULL;
AfxParseURL ( sGetFromURL, dwServiceType, sServerName, sObject, nPort );
// open HTTP connection
pHTTPServer = csiSession.GetHttpConnection ( sServerName, nPort );
// get HTTP object
pFile = pHTTPServer->OpenRequest ( CHttpConnection::HTTP_VERB_GET, sObject, NULL, 1, NULL, NULL, INTERNET_FLAG_RELOAD );
pFile->SendRequest();
}
La solution
Fermer, mais vous ne définissez pas l'en-tête correct. Vous devez faire:
request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)" );
Autres conseils
Vous définissez mal-tête Content-Type. La valeur que vous avez fourni correspond à plus-tête User-Agent