On 2/7/18 12:04 PM, Nicholas Wilson wrote:
Is it possible to have some urls routed to serve content and some to receive JSON in the same class? Basically I want:

shared static this()
{
     auto router = new URLRouter;
     auto a = new MyInterface;
    router.registerWebInterface(new MyInterface); //?? selective combination
     router.registerRestInterface(new MyInterface); //??
     auto settings = new HTTPServerSettings;
     settings.port = 8080;
     settings.bindAddresses = ["::1","127.0.0.1"];
     listenHTTP(settings, router);
}

class MyInterface
{
     SomeData[] items;
     // Get
     void index()
     {
         render!("index.dt");
     }
     // Get
     void getPage()
     {
         render!("page.dt", items);
     }

     // REST -> receive d as JSON.
     void postGiveMeData(SomeData d)
     {
         synchronized
         {
             items ~= d;
         }
     }
}

Yes you can, but it's not pretty.

interface MyInterface
{
   void postGiveMeData(SomeData d);
}

class MyInterfaceImpl : MyInterface
{
   void postGiveMeData(SomeData d) { ... }
   void getPage() { ... }
   void index() { ... }
}

auto myI = new MyInterfaceImpl;
router.registerRestInterface(myI);
router.get("/route/to/getPage", &myI.getPage);
router.get("/route/to/index", &myI.index);

This worked for me, but note that my "non-rest" function was static, so I didn't need to worry about instances. I'm not sure if the above works exactly right for you.

However, I would recommend actually not doing this for your purpose. My case was different -- I still wanted routes that were REST routes, but I wanted to control the result streaming (the vibe.d return value doesn't work with ranges, so I would have had to construct essentially my entire database in an array so I could return it).

In your case, I think you are better off using 2 classes, and one shared data storage area.

-Steve

Reply via email to