2013-07-22 47 views
6

Tôi đã cố gắng để có được điều này để làm việc cho một vài ngày tuy nhiên tôi tiếp tục nhận được một lỗi 400 từ máy chủ.BOOST ASIO POST HTTP YÊU CẦU - tiêu đề và nội dung

Về cơ bản, những gì tôi đang cố gắng làm là gửi một yêu cầu POST http đến một máy chủ yêu cầu một thân yêu cầu JSON với một vài thuộc tính.

Đây là những libs Tôi hiện đang sử dụng

CẬP NHẬT --- 7/23/13 10:00 chỉ nhận thấy tôi đang sử dụng giao thức TCP thay vì HTTP không chắc chắn có bao nhiêu điều này sẽ ảnh hưởng đến cuộc gọi HTTP nhưng tôi không thể tìm thấy bất kỳ ví dụ về các khách hàng sử dụng HTTP tinh khiết với BOOST :: ASIO

#include <iostream> 
#include <istream> 
#include <ostream> 
#include <string> 
#include <boost/asio.hpp> 

#include <sstream> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

using boost::property_tree::ptree; using boost::property_tree::read_json; using boost::property_tree::write_json; 

using boost::asio::ip::tcp; 

Thiết lập mã

// Get a list of endpoints corresponding to the server name. 
tcp::resolver resolver(io_service); 
tcp::resolver::query query(part1, "http"); 
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

// Try each endpoint until we successfully establish a connection. 
tcp::socket socket(io_service); 
boost::asio::connect(socket, endpoint_iterator); 

// Form the request. We specify the "Connection: close" header so that the 
// server will close the socket after transmitting the response. This will 
// allow us to treat all data up until the EOF as the content. 
boost::asio::streambuf request; 
std::ostream request_stream(&request); 

JSON BODY

ptree root, info; 
root.put ("some value", "8"); 
root.put ("message", "value value: value!"); 
info.put("placeholder", "value"); 
info.put("value", "daf!"); 
info.put("module", "value"); 
root.put_child("exception", info); 

std::ostringstream buf; 
write_json (buf, root, false); 
std::string json = buf.str(); 

HEADER VÀ KẾT NỐI YÊU CẦU

request_stream << "POST /title/ HTTP/1.1 \r\n"; 
request_stream << "Host:" << some_host << "\r\n"; 
request_stream << "User-Agent: C/1.0"; 
request_stream << "Content-Type: application/json; charset=utf-8 \r\n"; 
request_stream << json << "\r\n"; 
request_stream << "Accept: */*\r\n";  
request_stream << "Connection: close\r\n\r\n"; 

// Send the request. 
boost::asio::write(socket, request); 

tôi đặt giá trị giữ chỗ tuy nhiên nếu bạn thấy bất cứ điều gì mà không làm việc trong mã của tôi mà nhảy ra xin vui lòng cho tôi biết tôi không có ý tưởng tại sao tôi tiếp tục nhận được một 400, yêu cầu xấu.

thông tin về giàn khoan

C++

WIN7

VISUAL STUDIO

+0

Trước khi gửi toàn bộ yêu cầu, hãy in vào một số nhật ký hoặc bảng điều khiển và xem nó có chính xác hay không. –

+0

Bạn có đang viết 'json' giữa các trường tiêu đề không? – PSIAlt

+0

đây là nơi tệp json đang được nhập vào 'request_stream << json <<" \ r \ n ";' Tôi đã xem bộ đệm request_stream thông qua một trình gỡ lỗi cùng với bộ đệm yêu cầu. Tất cả mọi thứ có vẻ chính xác về nội dung tuy nhiên có một số không gian lạ bạn nghĩ rằng có thể có tác động? – progrenhard

Trả lời

10

Mặc dù câu hỏi này là rất cũ Tôi muốn gửi câu trả lời này cho những người dùng đang phải đối mặt vấn đề tương tự cho http BÀI ĐĂNG.

Máy chủ đang gửi cho bạn HTTP 400 có nghĩa là "BAD REQUEST". Đó là bởi vì cách bạn đang hình thành yêu cầu của bạn là hơi sai.

Sau đây là cách chính xác để gửi yêu cầu POST chứa dữ liệu JSON.

#include<string> //for length() 

request_stream << "POST /title/ HTTP/1.1 \r\n"; 
request_stream << "Host:" << some_host << "\r\n"; 
request_stream << "User-Agent: C/1.0"; 
request_stream << "Content-Type: application/json; charset=utf-8 \r\n"; 
request_stream << "Accept: */*\r\n"; 
request_stream << "Content-Length: " << json.length() << "\r\n";  
request_stream << "Connection: close\r\n\r\n"; //NOTE THE Double line feed 
request_stream << json; 

Bất cứ khi nào bạn đang gửi bất kỳ dữ liệu (json, chuỗi vv) với yêu cầu POST của bạn, hãy chắc chắn:

(1)Content-Length: là chính xác.

(2) mà bạn đặt Dữ liệu ở cuối yêu cầu của bạn với khoảng cách dòng.

(3) và cho rằng (điểm 2) xảy ra bạn PHẢI cung cấp thức ăn đường kép (ví dụ: \ r \ n \ r \ n) trong tiêu đề cuối cùng của yêu cầu tiêu đề của bạn. Điều này cho biết tiêu đề rằng nội dung yêu cầu HTTP kết thúc và bây giờ nó (máy chủ) sẽ nhận dữ liệu.

Nếu bạn không thực hiện việc này thì máy chủ không hiểu được nơi tiêu đề tiêu đề kết thúc? và dữ liệu đang bắt đầu từ đâu?Vì vậy, nó tiếp tục chờ đợi cho các dữ liệu hứa hẹn (nó treo).

Tuyên bố từ chối trách nhiệm: Vui lòng chỉnh sửa vì không chính xác, nếu có.

+0

+1, nó hoạt động tốt, nhưng cơ thể trống trên phía máy chủ với cùng dữ liệu json. Tôi đang sử dụng nodejs ở phía máy chủ. –