Expand my Community achievements bar.

Dive into Adobe Summit 2024! Explore curated list of AEM sessions & labs, register, connect with experts, ask questions, engage, and share insights. Don't miss the excitement.
SOLVED

REST call : AEM-Author to import data from external Systems

Avatar

Level 4

Condition is, when REST call in invoked   E,g, localhost:4502/content/a/b_jcr_content.getData.json (POST)

AEM will get all POST data and create a predefined node structure. 

This REST service will be invoked from an external system (outside AEM).  Is there any checklist / security considerations that should be taken in to account while developing this REST call. 

Another question : how would external system can invoke the call to AEM  Author instance , would they have to use credentials to fire the rest call along with port number ? 

1 Accepted Solution

Avatar

Correct answer by
Administrator

Hi

To answer you first part of the question:

You need to invoke the API from JSP/Sightly/JS using Ajex or you can achieve it from OSGI custom Service/Component. Then after parsing the response data you can save it in JCR using JCR API.

Link:- https://helpx.adobe.com/experience-manager/using/restful-services.html

// Creating Adobe Experience Manager bundles that invoke third party Restful web services

Link:- https://helpx.adobe.com/experience-manager/using/programmatically-accessing-cq-content-using.html and  https://helpx.adobe.com/experience-manager/using/querying-experience-manager-data-using1.html 

//Programmatically Accessing Adobe CQ Content using the JCR API

 

Answering to the Second Part:

AEM supports Restful services. Simply create Sling Servlets that can be accessed using an HTTP GET or HTTP POST.

If you  want to get page data, you can use default sling Get servlets. However - if you want to get non-page data - for example - a list of DAM assets in XML or pull data from a 3rd party database, encode the data into a specific JSON structure, and serve that data as the servlet's response - then you need to write your own Servlets. Rest of this is about that use case.

You can write custom application logic in the Servlets to perform business logic to meet your business requirements. For example, you can use the JCR API within the servlet to perform CRUD operations on JCR Data or JDBC data to get data from an external database (you can do what ever you want to meet your business requirements). 

As far as getting a Sling Servlet to return JSON - see this community article that shows how to write a Sling Servlet that returns JSON data:

https://helpx.adobe.com/experience-manager/using/custom-sling-servlets.html

This servlet uses the org.json.simple.JSONObject object to create JSON formatted data on the back end. 

https://code.google.com/p/json-simple/

Now this article invokes the servlet from a CQ page. However - you can easily hit the AEM Servlet from other apps that support Restful operations

 

Please refer to these post for detail answers:-

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

 

Demo Articles:

Link:- https://helpx.adobe.com/experience-manager/using/using-net-client-application.html

//Submitting data to the Adobe CQ JCR using a .NET client application

Link:- https://helpx.adobe.com/experience-manager/using/post_files.html

//Creating Java Swing applications that posts files to AEM ClientLibs folders

 

And

"would they have to use credentials to fire the rest call along with port number ? "

Credentials are needed for assessing restricted data, if it is public, we can get it directly.

 

Thanks and Regards

Kautuk Sahni



Kautuk Sahni

View solution in original post

9 Replies

Avatar

Correct answer by
Administrator

Hi

To answer you first part of the question:

You need to invoke the API from JSP/Sightly/JS using Ajex or you can achieve it from OSGI custom Service/Component. Then after parsing the response data you can save it in JCR using JCR API.

Link:- https://helpx.adobe.com/experience-manager/using/restful-services.html

// Creating Adobe Experience Manager bundles that invoke third party Restful web services

Link:- https://helpx.adobe.com/experience-manager/using/programmatically-accessing-cq-content-using.html and  https://helpx.adobe.com/experience-manager/using/querying-experience-manager-data-using1.html 

//Programmatically Accessing Adobe CQ Content using the JCR API

 

Answering to the Second Part:

AEM supports Restful services. Simply create Sling Servlets that can be accessed using an HTTP GET or HTTP POST.

If you  want to get page data, you can use default sling Get servlets. However - if you want to get non-page data - for example - a list of DAM assets in XML or pull data from a 3rd party database, encode the data into a specific JSON structure, and serve that data as the servlet's response - then you need to write your own Servlets. Rest of this is about that use case.

You can write custom application logic in the Servlets to perform business logic to meet your business requirements. For example, you can use the JCR API within the servlet to perform CRUD operations on JCR Data or JDBC data to get data from an external database (you can do what ever you want to meet your business requirements). 

As far as getting a Sling Servlet to return JSON - see this community article that shows how to write a Sling Servlet that returns JSON data:

https://helpx.adobe.com/experience-manager/using/custom-sling-servlets.html

This servlet uses the org.json.simple.JSONObject object to create JSON formatted data on the back end. 

https://code.google.com/p/json-simple/

Now this article invokes the servlet from a CQ page. However - you can easily hit the AEM Servlet from other apps that support Restful operations

 

Please refer to these post for detail answers:-

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

Link:- http://help-forums.adobe.com/content/adobeforums/en/experience-manager-forum/adobe-experience-manage...

 

Demo Articles:

Link:- https://helpx.adobe.com/experience-manager/using/using-net-client-application.html

//Submitting data to the Adobe CQ JCR using a .NET client application

Link:- https://helpx.adobe.com/experience-manager/using/post_files.html

//Creating Java Swing applications that posts files to AEM ClientLibs folders

 

And

"would they have to use credentials to fire the rest call along with port number ? "

Credentials are needed for assessing restricted data, if it is public, we can get it directly.

 

Thanks and Regards

Kautuk Sahni



Kautuk Sahni

Avatar

Community Advisor

ptK wrote...

Condition is, when REST call in invoked   E,g, localhost:4502/content/a/b_jcr_content.getData.json (POST)

AEM will get all POST data and create a predefined node structure. 

This REST service will be invoked from an external system (outside AEM).  Is there any checklist / security considerations that should be taken in to account while developing this REST call. 

Another question : how would external system can invoke the call to AEM  Author instance , would they have to use credentials to fire the rest call along with port number ? 

 

Hi 

Can you be bit clear whether you want to call the external REST call or you want to create REST call in AEM and expose it to external systems

 

Thanks,

Mani Kumar K

Avatar

Level 4

I want to create REST call in AEM E.g. localhost:4502/bin/abc/def  that will be invoked by some external systems to POST the data in to JCR. 

Avatar

Level 10

That is very easy to do. Write a Sling Servlet that defines doPost and then use an HTTP Post operation to invoke it. See this commuity article. IN this article - we are doing a POST to get a file into the AEM JCR: 

https://helpx.adobe.com/experience-manager/using/post_files.html

In this example - the client is a Java Desktop app. 

Avatar

Level 4

Thanks Scott.

I am thinking about what sort of user credentials I should create and provide to external systems can access so they can invoke REST call on AEM author ? 

 

And what sort of Read / Write access  levels should be assigned to the user 

Avatar

Level 10

Try giving the user that you use to authenticate the HTTP request read and write permissions required to access  the part of the JCR that you want to modify. I personally tested with Admin credentials. 

Avatar

Level 4

Thanks Scott .

I tried the admin access , it works for GET request but for POST request it gives an error : 

org.apache.sling.auth.core.impl.SlingAuthenticator getAnonymousResolver: Anonymous access not allowed by configuration - requesting credentials

I am testing the url for the page as http://localhost:4502/content/submitPage.groups.html 

And following are my properties for servlet : 

@SlingServlet(methods = {"POST,GET"}, 
metatype = true,
resourceTypes = {"services/powerproxy"},
selectors = {"groups"})

Avatar

Level 10

For testing purposes - try removing credentials to make sure that the POST servlet works - once we know if works - then we can figure out why authentication is not working. In the Java Swing article - notice the properties that removes authentication. I find it strange that GET is working - not POST. 

Avatar

Level 4

Its strange when I use : 

@SlingServlet(methods = {"POST,GET"}, 
metatype = true,
resourceTypes = {"services/powerproxy"},
selectors = {"groups"})  

This gives me following error  for POST request and admin account :  org.apache.sling.auth.core.impl.SlingAuthenticator getAnonymousResolver: Anonymous access not allowed by configuration - requesting credentials

When I use 

@SlingServlet(paths="/bin/upfile", methods = "POST", metatype=true)

 

I am able to test the Servlet with admin credentials .