2014-11-05 18 views
6

Ho bisogno di scrivere un client della riga di comando per giocare a tic-tac-toe su un server. il server accetta richieste HTTP e restituisce json al mio client. Sto cercando un modo rapido per inviare una richiesta http e ricevere il json come una stringa usando le librerie di boost.Come inviare la richiesta http e recuperare una risposta JSON C++ Boost

example http request = "http://???/newGame?name=david" 
example json response = "\"status\":\"okay\", \"id\":\"game-23\", \"letter\":2" 
+0

Nota per i biglietti da gravi (server web principalmente esistenti che possono fare qualsiasi sorta di Chunked encoding, compressions, keep-alive, redirect responses ecc.) vorrete usare una libreria come http://curl.haxx.se/libcurl/ – sehe

risposta

8

La cosa più semplice che si adatta alla descrizione:

Live On Coliru

#include <boost/asio.hpp> 
#include <iostream> 

int main() { 
    boost::system::error_code ec; 
    using namespace boost::asio; 

    // what we need 
    io_service svc; 
    ip::tcp::socket sock(svc); 
    sock.connect({ {}, 8087 }); // http://localhost:8087 for testing 

    // send request 
    std::string request("GET /newGame?name=david HTTP/1.1\r\n\r\n"); 
    sock.send(buffer(request)); 

    // read response 
    std::string response; 

    do { 
     char buf[1024]; 
     size_t bytes_transferred = sock.receive(buffer(buf), {}, ec); 
     if (!ec) response.append(buf, buf + bytes_transferred); 
    } while (!ec); 

    // print and exit 
    std::cout << "Response received: '" << response << "'\n"; 
} 

Questo riceve la risposta completa. È possibile verificare con un server fittizio:
(anche Live On Coliru):

netcat -l localhost 8087 <<< '"status":"okay", "id":"game-23", "letter":2' 

Questo mostrerà che la richiesta è pervenuta, e la risposta sarà scritto dal nostro codice client sopra.

Si noti che per più idee si poteva guardare gli esempi http://www.boost.org/doc/libs/release/doc/html/boost_asio/examples.html (anche se essi si concentrano sulle comunicazioni asincrone, perché questo è il tema della biblioteca Asio)

+0

Grazie mille per la risposta :) ma sto avendo un piccolo problema, –

+0

Grazie mille per la risposta :) ma sto avendo un piccolo problema, con queste righe: 'code'sock.connect ({{}, 8087})' codice' e: 'code'size_t bytes_transferred = sock.receive (buffer (buf), {}, ec) 'codice' Cosa devo mettere dentro le parentesi graffe. Ho fatto un po 'di lettura e per il secondo ho provato a fare un flag null socket_base :: message_flags; e passandolo, ma il mio programma sembra andare in crash. –

+0

È un '{{}, 8087}' è l'abbreviazione di 'ip :: tcp :: endpoint (ip :: address(), 8087)'. Quello che metti lì dipende da te (a cosa ti vuoi connettere?). Di solito, gli utenti finali specificano indirizzo e porta come stringhe e tu usi ** ['ip :: tcp :: resolver'] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference /ip__tcp/resolver.html)** da risolvere sugli endpoint. Quasi tutti i campioni client ti mostreranno come farlo ((a) in modo sincrono). In alternativa, 'ip :: address_v4 :: from_string (" 192.168.0.1 ")' può essere utilizzato per codificare un indirizzo IPv4, ad es. – sehe

Problemi correlati