如何在C ++服务器中解码curl url编码的字符串

时间:2019-06-29 15:21:32

标签: php c++ curl post server

我正在使用c ++ pastiche rest api库在ubuntu linux中制作rest api。 我已经使服务器正常工作。我可以使用php curl将数据发布到服务器。服务器接收数据并可以返回数据。 问题是这样的。当我使用curl post发布到服务器时,它将以url编码的字符串(如name=percy&age=34&eye_color=blue的形式发送到服务器。 我需要知道如何在C ++中将每个字符串放入一个字符串。 同样,这些字段之一也可能具有二进制数据以及普通字符串。我已经编写了解释二进制数据的代码,但是目前我不知道如何从curl转换字符串。 请忽略以下事实:我的端口在我的PHP中是不同的。原因是我在virtualbox中运行ubuntu。

我需要从我发送的帖子中提取字符串和二进制数据。这是我不知道该怎么做。 我不确定是否可能需要另一个库来做

这是我的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 :(得分:0)

我现在已经解决了这个问题,但是我不得不更改发送数据的方式。与其将数据作为formdata发送,不如将它以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进行了解析,并将其放入句子中并返回了该句子。因此,服务器现在正在执行我想要的操作,现在可以编写我的真实代码了。因为我使用的是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;
}