Products

Solutions

Resources

Partners

Community

About

New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.


New in 2sxc 7: #4 Using Visual Query with WebAPI (Updated)

This is a part of my series The New Features of 2sxc 7 and introduces you to using the Visual Query together with WebAPI

There are many ways to consume Query data - the most powerful way to give use it in JavaScript is to deliver it as JSON - which can be done easily in WebAPI. Here are the three ways to use queries in WebAPI:

  1. Updated / New in 7.1: Just use the REST API (see end of this article)
  2. Retrieve the data for some C# work inside WebAPI
  3. Get a Query and just serialize the entire query with all streams into JSON
  4. Just serialize some streams (not all) of a query to JSON
  5. Serialize one single content-item from a query into JSON
  6. Manually serialize something 

Method 1: Retrieve the data for code-use in WebAPI

Web-APIs are always written in C# - and the object App.Query[...] is also available there. So you can always access it through that, like:

var query = App.Query["All Active Categories"];
var categories = App.Query["All Active Categories"]["Categories"];

Typically it's more fun to work with dynamic objects, so you would usually write:

var categories = AsDynamic(App.Query["All Active Categories"]["Categories"]);

Method 2: Deliver an entire Query to JSON

For most cases when you just want to deliver the data as-is to your client, you can use our new serializers - like this:

    [HttpGet]
    [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Edit)]
    [ValidateAntiForgeryToken]
    public dynamic All()
    {
        return Sxc.Serializer.Prepare(App.Query["All Feedback"]); 

} 

Method 3: Deliver one stream from a Query to JSON

If you just want one stream - add that stream name as well:

    [HttpGet]
    [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Anonymous)]
    [ValidateAntiForgeryToken]
    public dynamic Categories()
    {
        // The following line demonstrates how we return all categories from the query, already sorted
        return Sxc.Serializer.Prepare(App.Query["All Categories"]["Default"]); 

}

BTW: You can also add more than one custom stream - so if your Query delivers 7 streams and you just want to deliver 2 of the streams in JSON, do this:

        return Sxc.Serializer.Prepare(App.Query["All Categories"], "Categories, Top10"); 

Method 4: Serialize a single item

        return Sxc.Serializer.Prepare(App.Query["All Categories"]["Default"].List.FirstOrDefault());

Method 5: Manually Serialize Something

Often you will have large objects (like Addresses with 20+ fields) but only want to serialize some fields. There are 2 ways to do this:

  1. Create a query which delivers fewer attributes using the Attribute-Filter (not explained here)
  2. Use an anonymous object in your WebAPI (see next example)

 

    [HttpGet]
    [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Anonymous)]
    [ValidateAntiForgeryToken]
    public dynamic Categories()
    {
        // And this demonstrates how we would return a list of assembled objects with attributes as we would want
        return from c in AsDynamic(App.Query["All Categories"]["Default"]) select new {
           Id = c.EntityId,
           Title = c.EntityTitle
        }; 

}

A Note on Query Parameters when using WebAPI

Since a Query can contain any kind of parameters like [QueryString:ID] or [Tab:TabId] or even [In:UserConfiguration:DefaultSortDirection] these are automatically resolved by the Query-Engine whenever you access the query. 

Just make sure that you are using the correct URL-Parameters in the WebAPI-call as they are expected in the Query. A typical mistake would be to have [QueryString:SortDirection] in your Visual Query, but use an AJAX-call placing the Sort-Direction in the post (instead of the url). 

Fully automatic REST / JSON-Interface

New in 2sxc 7.1: This is now possible! On each query you can set read-permissions and then access it through REST .../app-query/QUERYNAME. So you can create a query like "AllCategories", define that anonymous users may access it, and then call it from your JavaScript at  /DesktopModules/2sxc/API/app-query/AllCategories - this will return a JSON based on your query. Just remember to include DNN security tokens OR use the built in helpers from 2sxc which would do that for you - like the AngularJS-service called query.

It would be nice, if actually all Visual-Queries would be available as JSON automatically, without the need for a WebAPI-Interface. The reason this is missing is for security reasons. In WebAPI you can define security requirements for each call - but the Visual Query Designer doesn't offer security settings yet. Once we add that (probably in 2sxc 7.3) we will also create a fully automatic WebAPI-interface which won't require any more coding to retrieve data in JSON. 

Have Fun! 

With love from Switzerland,
Daniel 

Daniel Mettler grew up in the jungles of Indonesia and is founder and CEO of 2sic internet solutions in Switzerland and Liechtenstein, an 20-head web specialist with over 600 DNN projects since 1999. He is also chief architect of 2sxc (2SexyContent - see forge), an open source module for creating attractive content and DNN Apps.

Comments

There are currently no comments, be the first to post one.

Comment Form

Only registered users may post comments.

NewsArchives


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Daniels (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out