web services - tipo - ¿Cómo puedo enviar datos a una url usando QNetworkAccessManager?
webrequest create (6)
Actualizando la respuesta alexisdm a Qt5:
// Setup the webservice url
QUrl serviceUrl = QUrl("http://your.url");
QByteArray postData;
QUrl params;
QUrlQuery query;
query.addQueryItem("param1","string1");
query.addQueryItem("param2","string2");
params.setQuery(query);
postData = params.toEncoded(QUrl::RemoveFragment);
// Call the webservice
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)),
SLOT(onPostAnswer(QNetworkReply*)));
QNetworkRequest networkRequest(serviceUrl);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
networkManager->post(networkRequest,postData);
No te olvides de incluir
QT += network
en .pro.
Tengo un servicio web que necesito enviar algunos datos para usar Qt. Pensé que puedo usar un QByteArray cuando realice la POST en el servicio web.
Mi pregunta es, ¿cómo puedo formatear esta matriz para analizarla correctamente en el otro extremo?
Este es el código que tengo hasta ahora:
// Setup the webservice url
QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
QByteArray postData;
/*
Setup the post data somehow
I want to transmit:
param1=string,
param2=string
*/
// Call the webservice
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
networkManager->post(QNetworkRequest(serviceUrl), postData);
¡Gracias!
Aquí hay otra forma de manejar esto, estoy usando tu código también para dar un código completo:
// Setup the webservice url
QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
QByteArray postData;
QUrl params;
params.addQueryItem("param1","string1");
params.addQueryItem("param2","string2");
postData = params.encodedQuery();
// Call the webservice
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
networkManager->post(QNetworkRequest(serviceUrl), postData);
Dado que algunos parámetros y valores pueden necesitar ser utf-8 y por ciento codificados (espacios, &, =, caracteres especiales ...), debería utilizar QUrl
(para Qt 4) o QUrlQuery
(para Qt 5) para compilar los QUrlQuery
publicados. cuerda.
Código de ejemplo para Qt 4 :
QUrl postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
networkManager->post(request, postData.encodedQuery());
y para Qt 5 :
QUrlQuery postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
A partir de Qt 4.8 también puede usar QHttpMultiPart si necesita cargar archivos.
Solía:
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
Por lo tanto, en lugar de nueva línea después de cada parámetro.
la respuesta en realidad es
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
NOTA: use "&" aquí! .
No noté la respuesta de Juha aquí, y perdí mucho tiempo probando mi código usando el enfoque ", / n".
Por favor, cambia la respuesta correcta a la de Juha.
QByteArray postData;
postData.append("param1=string,/n");
postData.append("param2=string/n");