2014-11-05 18 views
6

Tôi cần viết ứng dụng dòng lệnh để chơi tic-tac-toe trên máy chủ. máy chủ chấp nhận các yêu cầu http và gửi lại json cho khách hàng của tôi. tôi đang tìm kiếm một cách nhanh chóng để gửi một yêu cầu http và nhận json như một chuỗi bằng cách sử dụng các thư viện tăng cường.Cách gửi yêu cầu http và truy xuất phản hồi json C++ Boost

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

Lưu ý cho doanh nghiệp (máy chủ web chủ yếu tồn tại nghiêm trọng có thể làm bất cứ cách của chunked mã hóa, nén, giữ-sống, chuyển hướng phản ứng vv), bạn sẽ muốn sử dụng một thư viện như http://curl.haxx.se/libcurl/ – sehe

Trả lời

8

Điều đơn giản nhất mà phù hợp với mô tả:

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"; 
} 

này nhận được phản hồi đầy đủ. Bạn có thể thử nghiệm nó với một máy chủ giả:
(còn Live On Coliru):

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

này sẽ chỉ cho rằng yêu cầu được nhận, và phản ứng sẽ được viết ra bởi mã khách hàng của chúng tôi ở trên.

Lưu ý rằng cho thêm ý tưởng bạn có thể nhìn vào các ví dụ http://www.boost.org/doc/libs/release/doc/html/boost_asio/examples.html (mặc dù họ tập trung vào truyền thông không đồng bộ, bởi vì đó là chủ đề của thư viện Asio)

+0

Cảm ơn rất nhiều cho trả lời :) nhưng tôi gặp một chút rắc rối, –

+0

Cảm ơn rất nhiều cho trả lời :) nhưng tôi gặp một chút rắc rối, với những dòng này: 'code' sock.connect ({{}, 8087}) 'code' và:' code'size_t bytes_transferred = sock.receive (buffer (buf), {}, ec) 'code' Tôi nên đặt gì bên trong niềng răng. tôi đã làm một chút đọc và cho một thứ hai tôi đã cố gắng làm cho một null socket_base :: message_flags cờ; và vượt qua điều đó nhưng chương trình của tôi dường như bị lỗi. –

+0

Đó là một '{{}, 8087}' là viết tắt của 'ip :: tcp :: endpoint (ip :: address(), 8087)'. Những gì bạn đặt ở đó tùy thuộc vào bạn (bạn muốn kết nối với điều gì?). Thông thường, người dùng cuối chỉ định địa chỉ và cổng là chuỗi và bạn sử dụng ** ['ip :: tcp :: resolver'] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference /ip__tcp/resolver.html)** để giải quyết (các) điểm cuối. Hầu như tất cả các mẫu khách hàng sẽ chỉ cho bạn cách thực hiện điều này ((a) đồng bộ). Ngoài ra, 'ip :: address_v4 :: from_string (" 192.168.0.1 ")' có thể được sử dụng để mã hóa địa chỉ ipv4, ví dụ: – sehe

Các vấn đề liên quan