Estoy usando la biblioteca API de Rest Rest Pastiche C ++ para hacer una API de descanso en Ubuntu Linux. Tengo el servidor para trabajar sin problemas. Puedo usar PHP CURL para publicar datos en mi servidor. El servidor recibe los datos y puede devolver los datos. El problema es este. Cuando publico al servidor con RUCL POST, lo envía al servidor en una cadena de URL codificada como esta name=percy&age=34&eye_color=blue. Necesito saber cómo en C ++ poner a cada uno en una cadena. También uno de los campos también puede tener datos binarios, así como cadenas ordinarias. Ya he escrito el código para interpretar los datos binarios, pero no sé cómo convertir la cadena de la publicación de Curl en este momento. Por favor, ignore el hecho de que mi puerto es diferente en mi PHP. La razón es que estoy ejecutando Ubuntu en VirtualBox.

Necesito extraer cuerdas y datos binarios de la publicación que estoy enviando. Esto es lo que no sé cómo hacer. No estoy seguro de si puedo necesitar otra biblioteca para hacer esto, o no

Aquí está mi código PHP: -

$postData = http_build_query(
            array(
                'dstdata' => 'hello',
                'more' => 'test',
                'age' => 34
            )
        );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'localhost:9999/about');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        print_r($output);       
        curl_close($ch);

El código anterior haría una cadena como esta dstdata=hello&more=test&age=34

Y aquí el código del servidor C ++. Puedes ver que tengo dos rutas configuradas aquí: -

#include <pistache/router.h>
#include "pistache/endpoint.h"
#include "pistache/http.h"
#include <iostream>

using namespace Pistache;
using namespace Rest;

Rest::Router router;

void sausage(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "We have contact" << std::endl;
    response.send(Http::Code::Ok, "Bottoms Up\n");
}

void about(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "Server Running" << std::endl;
    response.send(Http::Code::Ok, request.body());
}

int main(){
    Routes::Get(router,"/ready",Routes::bind(&sausage));
    Routes::Post(router,"/about",Routes::bind(&about));
    Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(9080));
    auto opts = Pistache::Http::Endpoint::options()
        .threads(10).flags(
        Pistache::Tcp::Options::ReuseAddr);
    Http::Endpoint server(addr);
    server.init(opts);
    server.setHandler(router.handler());
    server.serve();
    return 0;
}   
1
Thomas Williams 29 jun. 2019 a las 18:21

1 respuesta

La mejor respuesta

He resuelto esta pregunta ahora, pero tuve que cambiar la forma en que envié los datos. En lugar de enviar los datos como Formdata, lo envié, JSON codificado así.

<?php
$data = array("name" => "Paul", "age" => "38");                                                                    
$data_string = json_encode($data);                                                                                   
$ch = curl_init('localhost:9999/newtest');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                    
$result = curl_exec($ch);
print_r($result);

Luego instalé la biblioteca Nlohmann JSON. Este ejemplo que he mostrado me permite publicar en mi servidor como datos JSON. Tengo JSON lo analizó y lo puse en una oración y devolví la oración. Así que el servidor ahora está haciendo lo que quiero, ahora puedo escribir mi código real. Debido a que estoy usando la codificación de JSON, también puedo usar esto para enviar datos binarios también. Así que parece que he resuelto mi problema.

#include <pistache/router.h>
#include "pistache/endpoint.h"
#include "pistache/http.h"
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace Pistache;
using namespace Rest;
Rest::Router router;

void newtest(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "NewTest" << std::endl;
    auto jj = json::parse(request.body());
    std::string name = jj["name"];
    std::string age =jj["age"];
    std::string test = name+" is my name, and my age is "+age;
    response.send(Pistache::Http::Code::Ok, test);
}

int main(){
    Routes::Post(router,"/newtest",Routes::bind(&newtest));
    Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(9080));
    auto opts = Pistache::Http::Endpoint::options()
        .threads(10).flags(
        Pistache::Tcp::Options::ReuseAddr);
    Http::Endpoint server(addr);
    server.init(opts);
    server.setHandler(router.handler());
    server.serve();
    return 0;
}   
0
halfer 7 jul. 2019 a las 08:50