2013-02-19 2 views
0

Мне нужно создать C++-приложение C++, которое принимает данные post. Я буду принимать объект json. Как получить полезную нагрузку?Как получить полезную нагрузку json для сообщения C++ json

я могу получить данные ПОЛУЧИТЬ используя приведенный ниже

int main() { 
    bool DEBUG = true; 

    cout << "content-type: text/html" << endl << endl; 

    //WHAT GOES HERE FOR POST 
    json=????? 

    //THIS IS A GET 
    query_string = getenv("QUERY_STRING"); 

} 
+0

Я уверен, что это зависит от веб-сервера, вызывающего ваше приложение. Но apache поставляет его на stdin: http://httpd.apache.org/docs/2.2/howto/cgi.html –

+0

@LokiAstari Это обычное поведение, см. [Википедия - CGI] (http: //en.wikipedia. org/wiki/Common_Gateway_Interface) и [RFC 3875] (http://tools.ietf.org/html/rfc3875#section-4.2) –

ответ

2

Если тип метода POST (вы также можете проверить это), то POST-данные записываются в стандартный ввод. Таким образом, вы можете использовать стандартные методы, как это:

// Do not skip whitespace, more configuration may also be needed. 
cin >> noskipws; 

// Copy all data from cin, using iterators. 
istream_iterator<char> begin(cin); 
istream_iterator<char> end; 
string json(begin, end); 

// Use the JSON data somehow. 
cout << "JSON was " << json << endl; 

Это будет читать все данные из CIN в JSON, пока не произойдет EOF.

+1

Простым способом не пропускать пробел является использование 'std :: istreambuf_iterator'. –

2

Предполагая, что апач:

documentation is found here:

Вы найдете его в нижней части, но после данных обеспечивается через стандартный ввод.

#include <iostream> 
#include <string> 
#include <sstream> 

int main() 
{ 
    bool DEBUG = true; 

    std::cout << "content-type: text/html\n\n"; // prefer \n\n to std::endl 
               // you probably don't want to flush immediately. 

    std::stringstream post; 
    post << std::cin.rdbuf(); 

    std::cout << "Got: " << post.str() << "\n"; 
} 
+0

Я использую nginx. Будет ли он работать? – Tampa

+0

@Tampa: См. Комментарии «Olaf Dietsche» выше. Он говорит, что это определено в RFC 3875. Так что, наверное. Но вы должны прочитать свою документацию (или просто попробуйте посмотреть, что произойдет). –