Foros del Web » Programación para mayores de 30 ;) » C/C++ »

C++ Rest SDK para web service

Estas en el tema de C++ Rest SDK para web service en el foro de C/C++ en Foros del Web. Buenas, Llevo ya unos dias investigando sobre como hacer un web service en C++, tengo muchas dudas y no se por donde empezar. He estado ...
  #1 (permalink)  
Antiguo 11/12/2014, 03:29
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 5 meses
Puntos: 0
C++ Rest SDK para web service

Buenas,

Llevo ya unos dias investigando sobre como hacer un web service en C++, tengo muchas dudas y no se por donde empezar.
He estado instalando el sdk desde el nuget del visual studio 2010 y he probado el codigo de ejemplo de la web, para así poder entender un poco como va esto:

Código C++:
Ver original
  1. #include <cpprest/http_client.h>
  2. #include <cpprest/filestream.h>
  3.  
  4. using namespace utility;                    // Common utilities like string conversions
  5. using namespace web;                        // Common features like URIs.
  6. using namespace web::http;                  // Common HTTP functionality
  7. using namespace web::http::client;          // HTTP client features
  8. using namespace concurrency::streams;       // Asynchronous streams
  9.  
  10. int main(int argc, char* argv[])
  11. {
  12.     auto fileStream = std::make_shared<ostream>();
  13.  
  14.     // Open stream to output file.
  15.     pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)
  16.     {
  17.         *fileStream = outFile;
  18.  
  19.         // Create http_client to send the request.
  20.         http_client client(U("http://www.bing.com/"));
  21.  
  22.         // Build request URI and start the request.
  23.         uri_builder builder(U("/search"));
  24.         builder.append_query(U("q"), U("Casablanca CodePlex"));
  25.         return client.request(methods::GET, builder.to_string());
  26.     })
  27.  
  28.     // Handle response headers arriving.
  29.     .then([=](http_response response)
  30.     {
  31.         printf("Received response status code:%u\n", response.status_code());
  32.  
  33.         // Write response body into the file.
  34.         return response.body().read_to_end(fileStream->streambuf());
  35.     })
  36.  
  37.     // Close the file stream.
  38.     .then([=](size_t)
  39.     {
  40.         return fileStream->close();
  41.     });
  42.  
  43.     // Wait for all the outstanding I/O to complete and handle any exceptions
  44.     try
  45.     {
  46.         requestTask.wait();
  47.     }
  48.     catch (const std::exception &e)
  49.     {
  50.         printf("Error exception:%s\n", e.what());
  51.     }
  52.  
  53.     return 0;
  54. }

No puedo ejecutarlo ya que me salen los siguientes errores

pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)

Me dice que fstream --> Error: no existe ninguna conversión adecuada definida por el usuario de "pplx::task<pplx::details::_BadContinuationParamTy pe>" a "pplx:task<void>"

Alguna idea?

Despues de crear el proyecto he echo boton derecho y he añadido el sdk desde el NuGet package Manager.

No se si alguien me puede dar una mano con esto.

Saludos
  #2 (permalink)  
Antiguo 11/12/2014, 04:25
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: C++ Rest SDK para web service

Me meto con este tema del que no sé nada; ni siquiera conozco esas librerías tan chulas que parece que resuelven un web service en tres líneas.

Pero bueno, adivinando, y espero que no te moleste, a tu compilador no le convence que tu requestTask sea de tipo void:
pplx::task<void> requestTask = ...

Yo haría un experimento: reemplazaría esa asignación por
auto requestTask = ...
y si de milagro llegara a funcionar, le preguntaría al compilador qué entiende él por "auto" en esa línea. (Es que para mí está muy bien la nueva palabrita, pero me saca de quicio no saber qué ha puesto)
  #3 (permalink)  
Antiguo 11/12/2014, 08:39
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: C++ Rest SDK para web service

Se va ese error pero sale otro, me parca el corchete de abajo diciendome.

Error: el cuerpo de una lambda que devuelve valores sin ningún tipo de valor devuelto explícita debe ser una instrucción return simple.

Si lo ejecuto me sale que sino he incluido una cabecera "StdAdfx.h".

Ya que veo que me has contestado, quizas lo que intento hacer no es la mejor forma no? Quiero decir lo de hacer un web service con C++, quizas podria hacerlo en php y que este me ejecute el codigo en C++.


Saludos
  #4 (permalink)  
Antiguo 11/12/2014, 09:43
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: C++ Rest SDK para web service

No, no estaba siendo sarcástico, realmente no tenía idea de que microsoft tiene una herramienta para hacer web services en C++. (Yo alguna vez usé gsoap, y me resultó bastante complicado)

Repensando mi sugerencia de que trates de usar
auto requestTask = ...
no va funcionar, porque no es una construcción legal en C++.

De todos modos, hay una inconsistencia ahí. La función lambda devuelve
return client.request(methods::GET, builder.to_string());
y es el tipo de dato de ese client.request() con lo que hay que definir a requestTask.

Yo no tengo el Visual Studio, pero fíjate que tipo es ese de client.request(), para poner el mismo tipo en lugar del las XXXXX en
pplx::task<XXXXX> requestTask = ...

Última edición por lareto; 11/12/2014 a las 10:18
  #5 (permalink)  
Antiguo 11/12/2014, 13:27
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: C++ Rest SDK para web service

Te resultó bastante complicado? Pues por lo que puedo ver, veo que dominas bastante el tema, si a ti resulto complicado yo voy a flipar he tocado C pero nunca C.

Quizas tenga que cambiar de tactica, estoy haciendo esto porque necesito enviar una foto desde el movil en Android y tengo un codigo echo en C++ que tiene que recibir esa imagen. Quizas puedo hacerlo de otra forma, recibiendo la imagen desde PHP y que este ejecute un script en C++ pasandole la imagen.

No se, la verdad que estoy un poco desesperado, porque este codigo que he puesto es directamente desde la web C++ Rest SDK y es el codigo para beginers y resulta que no funciona.
  #6 (permalink)  
Antiguo 11/12/2014, 19:58
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: C++ Rest SDK para web service

Prueba con esto y me dices qué resulta:

Cambia esta línea:
Código:
pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)
Por esta otra:
Código:
pplx::task<web::http::http_response> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)
Y cuéntame.
  #7 (permalink)  
Antiguo 12/12/2014, 03:42
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: C++ Rest SDK para web service

Me sigue marcando lo mismo, es decir me marca "fstream", que no devuelve un dato de tipo hhtp::http_response. Exactamente esto.
class Concurrency::streams::file_stream<uint8_t>
Error: no existe nunguna conversión adecuada definida por el usuario de "pplx::task<pplx::detauls::_BadContinuationParamTy pe>" a "pplx::task<web::http::http_response>"

Buscando por internet me he encontrado un post en stackOverflow de un usuario que probaba esto:

http://stackoverflow.com/questions/2...client-request

Pero a mi tampoco me funciona.

Saludos

Etiquetas: char, int, rest, sdk, service
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:54.