Как декодировать закодированную строку curl url на сервере C ++ - PullRequest
1 голос
/ 29 июня 2019

Я использую библиотеку api rest C ++ pastiche для создания API остальных в Ubuntu Linux.У меня сервер работает без проблем.Я могу использовать php curl для публикации данных на моем сервере.Сервер получает данные и может вернуть данные.Проблема в этом.Когда я отправляю сообщение на сервер с сообщением curl, оно отправляет его на сервер в виде строки в кодировке URL, например name=percy&age=34&eye_color=blue.Мне нужно знать, как в C ++ поместить каждый в строку.Также одно из полей может также иметь двоичные данные, а также обычные строки.Я уже написал код для интерпретации двоичных данных, но в настоящее время я не знаю, как преобразовать строку из сообщения curl.Пожалуйста, игнорируйте тот факт, что мой порт отличается в моем php.Причина в том, что я запускаю Ubuntu в virtualbox.

Мне нужно извлечь строки и двоичные данные из сообщения, которое я отправляю.Это то, что я не знаю, как это сделать.Я не уверен, что мне может понадобиться другая библиотека для этого или нет

Вот мой php-код: -

$postData = http_build_query(
            array(
                'dstdata' => 'hello',
                'more' => 'test',
                'age' => 34
            )
        );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'localhost:9999/about');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        print_r($output);       
        curl_close($ch);

Приведенный выше код может создать такую ​​строку dstdata=hello&more=test&age=34

А вот код сервера c ++.Вы можете видеть, что у меня есть два настроенных маршрута здесь: -

#include <pistache/router.h>
#include "pistache/endpoint.h"
#include "pistache/http.h"
#include <iostream>

using namespace Pistache;
using namespace Rest;

Rest::Router router;

void sausage(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "We have contact" << std::endl;
    response.send(Http::Code::Ok, "Bottoms Up\n");
}

void about(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "Server Running" << std::endl;
    response.send(Http::Code::Ok, request.body());
}

int main(){
    Routes::Get(router,"/ready",Routes::bind(&sausage));
    Routes::Post(router,"/about",Routes::bind(&about));
    Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(9080));
    auto opts = Pistache::Http::Endpoint::options()
        .threads(10).flags(
        Pistache::Tcp::Options::ReuseAddr);
    Http::Endpoint server(addr);
    server.init(opts);
    server.setHandler(router.handler());
    server.serve();
    return 0;
}   

1 Ответ

0 голосов
/ 04 июля 2019

Я решил этот вопрос сейчас, но мне пришлось изменить способ отправки данных.Вместо того, чтобы отправлять данные в виде форм-данных, я отправлял их в json-кодировке следующим образом.

<?php
$data = array("name" => "Paul", "age" => "38");                                                                    
$data_string = json_encode($data);                                                                                   
$ch = curl_init('localhost:9999/newtest');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                    
$result = curl_exec($ch);
print_r($result);

Затем я установил библиотеку nlohmann json.Этот пример, который я показал, позволяет мне публиковать на своем сервере данные в формате JSON.Я проанализировал его, поместил в предложение и вернул предложение.Теперь сервер делает то, что я хочу, теперь я могу написать свой реальный код.Поскольку я использую кодировку JSON, я также могу использовать это для отправки двоичных данных.Похоже, я решил свою проблему.

#include <pistache/router.h>
#include "pistache/endpoint.h"
#include "pistache/http.h"
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace Pistache;
using namespace Rest;
Rest::Router router;

void newtest(const Rest::Request& request, Http::ResponseWriter response){
    std::cout << "NewTest" << std::endl;
    auto jj = json::parse(request.body());
    std::string name = jj["name"];
    std::string age =jj["age"];
    std::string test = name+" is my name, and my age is "+age;
    response.send(Pistache::Http::Code::Ok, test);
}

int main(){
    Routes::Post(router,"/newtest",Routes::bind(&newtest));
    Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(9080));
    auto opts = Pistache::Http::Endpoint::options()
        .threads(10).flags(
        Pistache::Tcp::Options::ReuseAddr);
    Http::Endpoint server(addr);
    server.init(opts);
    server.setHandler(router.handler());
    server.serve();
    return 0;
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...