pistache icon indicating copy to clipboard operation
pistache copied to clipboard

Multiple Query Parameter Example

Open Lake-Jee opened this issue 4 years ago • 1 comments

Hi all! Pistache n00b here!

Does anyone have any examples of using curl POST using multiple http query parameters?

Something like this: http://localhost:9080/ping?chunked&foo=0&bar=0

I have some example code but so far im not having very much luck! It is essentially modifying a rest_server example and the http_server example!

Does Pistache support what im looking for?

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

using namespace Pistache;
using namespace Rest;

Rest::Router router;

void kimchi(const Rest::Request& request, Http::ResponseWriter response)
{
    std::cout << "We have contact... pour the soju!" << 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());
}

void param_test(const Rest::Request& request, Http::ResponseWriter response)
{
    if (request.method() == Http::Method::Post) 
    {
        using namespace Http;

        auto query = request.query();

        if (query.has("chunked") && query.has("foo=0") && query.has("bar=0")) // <-- Place multiple query params here
        {
            std::cout << "Using chunked encoding \n";

            response.headers()
                .add<Header::Server>("pistache/0.1")
                .add<Header::ContentType>(MIME(Text, Plain));

            response.cookies()
                .add(Cookie("lang", "en-US"));

            auto stream = response.stream(Http::Code::Ok);
            stream << "GRAB ";
            stream << "THE ";
            stream << "SOJU \n";
            stream << ends;

            std::cout << "Http query: " << query.as_str() << "\n";
            std::cout << request.body();
        }
        else { // <-- Default response
            response.send(Http::Code::Ok, "Just a water please \n");
            std::cout << "Http query: " << query.as_str() << "\n";
            std::cout << request.body();
        }
    }
}

int main()
{
    Routes::Get(router,"/ready", Routes::bind(&kimchi));
    Routes::Post(router,"/ping", Routes::bind(&param_test));
    Routes::Post(router,"/about",Routes::bind(&about));
    
    Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(9080));
    
    int thr = 8;
    auto opts = Pistache::Http::Endpoint::options()
        .threads(thr).flags(
        Pistache::Tcp::Options::ReuseAddr);

    std::cout << "Number of cores:  " << std::thread::hardware_concurrency() << "\n";
    std::cout << "Number of threads " << thr << "\n";

    Http::Endpoint server(addr);
    server.init(opts);
    server.setHandler(router.handler());
    server.serve();
    return 0;
}

Lake-Jee avatar Jun 09 '20 19:06 Lake-Jee

I found out this line if (query.has("chunked") && query.has("foo=0") && query.has("bar=0")) was the issue.

This is what it should be: if (query.has("chunked") && query.has("foo") && query.has("bar"))

and the actual curl command should look like this: curl -X POST http://localhost:9080/ping?chunked&foo=0&bar=0

Lake-Jee avatar Jun 10 '20 12:06 Lake-Jee