我正在使用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;
}
答案 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;
}