2017-10-12 6 views
2

Je veux vérifier si une ressource Sling existe déjà. Actuellement j'utilise CQ.HTTP.get(url) pour accomplir ceci. Le problème est que si la ressource n'existe pas, JS enregistre une erreur 404 sur la console qui est moche.JS: Vérifie si la ressource Sling existe sans créer d'erreur 404

Existe-t-il un meilleur moyen de vérifier s'il existe une ressource qui ne pollue pas la console?

+0

écrire votre propre servlet, faire revenir un vrai/faux avec un statut 200. – awd

Répondre

3

Voici une servlet simple qui fait ce que vous vous demandez:

/** 
* Servlet that checks if resource exists. 
*/ 
@SlingServlet 
(
    paths = "/bin/exists", 
    extensions = "html", 
    methods = "GET" 
) 
public class ResourceExistsServlet extends SlingSafeMethodsServlet { 

    @Override 
    protected void doGet(final SlingHttpServletRequest request, 
         final SlingHttpServletResponse response) throws ServletException, IOException { 
     // get the resource by the suffix 
     // for example, in the request /bin/exists.htm/apps, "/apps" is the suffix and that's the resource obtained here. 
     Resource resource = request.getRequestPathInfo().getSuffixResource(); 
     // resource is null, does not exist, not null, exists 
     boolean exists = resource != null; 
     // make the response content type JSON 
     response.setContentType(JSONResponse.APPLICATION_JSON_UTF8); 
     // Write the json to the response 
     // TODO: use a library for more complicated JSON, like google's gson. In this case, this string suffices. 
     response.getWriter().write("{\"exists\": "+exists+"}"); 
    } 
} 

Et voici quelques exemple JS pour appeler le servlet:

// Check if a path exists exists 
function exists(path){ 
    return $.getJSON("/bin/exists.html"+path); 
} 

// check if /apps exists 
exists("/apps") 
.then(function(res){console.log(res.exists)}) 
// prints: true 


// check if /apps123 exists 
exists("/apps123") 
.then(function(res){console.log(res.exists)}) 
// prints: false 
+0

Je suggère les améliorations suivantes: - utilisez [org.apache.sling.commons.json.JSONObject] (https://sling.apache.org/apidocs/sling7/org/apache/sling/commons/json/JSONObject .html) pour générer la chaîne json - changez l'extension en .json ou supprimez-la car elle n'a pas d'effet lorsque vous définissez la propriété "paths" – d33t

+1

Ce paquet est obsolète dans AEM 6.3 –

+0

C'est vrai, merci d'avoir choisi cela. La bibliothèque a été dépréciée en raison de [raisons légales] (http://markmail.org/thread/3kx7kkeaksqiduz5), vous pouvez trouver [ici] (http://blogs.perficient.com/adobe/2017/08/02/aem -6-3-handing-feelings-of-deprecation /) quelques alternatives. A côté de cela, la question est pour cq5 où c'est la manière commune traitant de JSON. – d33t