2013-07-22 11 views
6

मैं इसे कुछ दिनों तक काम करने की कोशिश कर रहा हूं हालांकि मुझे सर्वर से 400 त्रुटि मिल रही है।बूस्ट एएसआईओ पोस्ट HTTP अनुरोध - शीर्षलेख और शरीर

असल में, मैं जो करने की कोशिश कर रहा हूं वह एक सर्वर को एक http POST अनुरोध भेजता है जिसके लिए एक JSON अनुरोध निकाय को दो गुणों के साथ आवश्यकता होती है।

इन libs मैं वर्तमान में

अपडेट --- 7/23/13 10:00 बजे बस देखा मैं HTTP यकीन नहीं कितना यह एक HTTP कॉल प्रभाव होगा लेकिन के बजाय टीसीपी उपयोग कर रहा हूँ का उपयोग कर रहा हैं मैं बूस्ट के साथ शुद्ध HTTP उपयोग करने वाले ग्राहकों के किसी भी उदाहरण नहीं मिल सकता है :: 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; 

स्थापित कोड

// 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 शरीर

+०१२३५१६४१०
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(); 

शीर्षक और कनेक्शन अनुरोध

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

मैं तथापि स्थान धारक मूल्यों डाल आप कुछ भी है कि मेरे कोड है कि बाहर कूदता में काम नहीं करता यदि मुझे पता है मुझे पता नहीं क्यों मैं एक मिलती रहती है तो कृपया 400 गलत अनुरोध। रिग

सी ++

WIN7

दृश्य स्टूडियो

+0

पूरा अनुरोध भेजने से पहले, कुछ लॉग या कंसोल में प्रिंट करें और देखें कि यह सही है या नहीं। –

+0

क्या आप हेडर फ़ील्ड के बीच 'json' लिख रहे हैं? – PSIAlt

+0

यह वह जगह है जहां जेसन फ़ाइल को 'request_stream << json << "\ r \ n" इनपुट किया जा रहा है;' मैं अनुरोध बफर के साथ डीबगर के माध्यम से request_stream बफर को देख रहा हूं। सामग्री के संदर्भ में सबकुछ सही लगता है, हालांकि कुछ अजीब रिक्त स्थान हैं जो आपको लगता है कि इसका असर हो सकता है? – progrenhard

उत्तर

10

हालांकि इस सवाल का बहुत पुराना मैं उपयोगकर्ताओं को, जो http के लिए इसी तरह की समस्या का सामना कर रहे के लिए इस उत्तर पोस्ट करने के लिए चाहते हैं के बारे में

की जानकारी पद।

सर्वर आपको HTTP 400 भेज रहा है "बाड अनुरोध"। ऐसा इसलिए है क्योंकि जिस तरह से आप अपना अनुरोध बना रहे हैं वह थोड़ा गलत है।

JSON डेटा युक्त POST अनुरोध भेजने का सही तरीका निम्नलिखित है।

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

जब भी आप अपने पोस्ट अनुरोध के साथ किसी भी डेटा (json, स्ट्रिंग आदि) भेज रहे हैं, सुनिश्चित करें:

(1)सामग्री-लंबाई: सटीक है।

(2) कि आपने डेटा अनुरोध के अंत में डेटा को आपके अंतराल के अंत में रखा है।

(3) और उस (2 अंक) के लिए आप MUST होने की आपके शीर्षक अनुरोध के अंतिम शीर्षक में डबल लाइन फ़ीड (अर्थात \ r \ n \ r \ n) प्रदान करते हैं। यह हेडर को बताता है कि HTTP अनुरोध सामग्री खत्म हो गई है और अब यह (सर्वर) डेटा प्राप्त करेगी।

यदि आप ऐसा नहीं करते हैं तो सर्वर यह समझने में विफल रहता है कि शीर्षलेख समाप्त हो रहा है? और जहां डेटा शुरू हो रहा है?इसलिए, यह वादा किए गए डेटा (यह लटकता है) के लिए इंतजार कर रहा है।

अस्वीकरण: त्रुटियों के लिए संपादित करने के लिए स्वतंत्र महसूस करें, यदि कोई हो।

+0

+1 के संयोजन का उपयोग किया, यह ठीक काम करता है, लेकिन उसी जेसन डेटा के साथ सर्वर पक्ष पर शरीर खाली है। मैं सर्वर की तरफ नोडज का उपयोग कर रहा हूं। –

संबंधित मुद्दे