2013-07-22 21 views
6

Próbowałem uruchomić to na kilka dni, ale ciągle otrzymuję błąd 400 z serwera.BOOST ASIO POST HTTP REQUEST - nagłówki i treść

Zasadniczo próbuję wysłać żądanie HTTP POST do serwera, który wymaga ciała żądania JSON z kilkoma właściwościami.

Są libs Obecnie używam

UPDATED --- 7/23/13 10:00 Właśnie zauważyłem używam TCP zamiast HTTP nie wiem, ile to będzie efekt połączenia HTTP ale nie mogę znaleźć żadnych przykładów klientów przy użyciu czystego HTTP z 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; 

SET UP KOD

// 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 CIAŁA

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(); 

nagłówka i żądanie połączenia

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); 

kładę wartości posiadacz miejsce jednak jeśli widzisz niczego, co nie działa w moim kodu, który wyskakuje proszę dać mi znać nie mam pojęcia dlaczego Wciąż otrzymuję 400, złe żądanie.

informacji o platformie

C++

WIN7

Visual Studio

+0

Przed wysłaniem całej prośby, wydrukuj dziennik lub konsolę i sprawdź, czy jest poprawna. –

+0

Czy piszesz 'json' między polami nagłówka? – PSIAlt

+0

to tutaj wprowadzany jest plik json 'request_stream << json <<" \ r \ n ";' Sprawdzałem bufor request_stream przez debugger wraz z buforem żądania. Wszystko wydaje się poprawne pod względem zawartości, ale są jakieś dziwne przestrzenie, które uważasz, że mogą mieć wpływ? – progrenhard

Odpowiedz

10

Choć kwestia ta jest bardzo stara Chciałbym opublikować tę odpowiedź dla użytkowników, którzy stoją przed podobnym problemem dla http STANOWISKO.

Serwer wysyła Cię HTTP 400 oznacza "ZŁE ZAPYTANIE". To dlatego, że sposób, w jaki formułujesz swoją prośbę, jest trochę błędny.

Poniżej przedstawiono poprawny sposób wysyłania żądania POST zawierającego dane 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; 

Gdy wysyłasz żadnych danych (json, łańcuch itp) z żądania POST, upewnij się:

(1)Content-Length: jest dokładna.

(2) że dane zostaną umieszczone na końcu żądania z przerwą między wierszami.

(3) iz tego punktu (2) do zdarzy ci MUST zapewnić podwójną nowego wiersza (tj \ r \ n \ r \ n) w ostatnim nagłówku żądania nagłówka. To mówi nagłówkowi, że treść żądania HTTP jest skończona, a teraz to (serwer) otrzyma dane.

Jeśli tego nie zrobisz, serwer nie zrozumie, gdzie kończy się nagłówek ? i gdzie zaczyna się danych?Tak więc wciąż czeka na obiecane dane (zawiesza się).

Nota prawna: Zachowaj możliwość edycji w przypadku nieścisłości, jeśli występują.

+0

+1, działa dobrze, ale treść jest pusta po stronie serwera z tymi samymi danymi json. Używam nodejs po stronie serwera. –

Powiązane problemy