Search code examples
enyo

AJAX Call using Enyo Framework


I am trying to make an ajax call using the enyo framework and I am running headlong in to a problem. The error message I am getting is 0. That's it just a 0. I made sure my link to the json file was correct and I built this jsfiddle to test it out http://jsfiddle.net/mmahon512/CPU8n/2/ Any help is greatly appreciated. My host is GoDaddy and I made sure that I added the json extension to my web config correctly. The link to the json file is correct and it returns valid json. I checked it using jsonlint. Here is what the code looks like on jsfiddle:

enyo.kind({ name: "AjaxSample", components: [ { kind: "Button", content: "Fetch Users", ontap: "fetch" }, { name: "repos", content: "Not loaded...", allowHtml: true } ], fetch: function() { var ajax = new enyo.Ajax({ url: "http://atxapps.com/_sites/atxapps.com/dev/jetstream/assets/dataUsers.json" }); ajax.go(); ajax.response(this, "gotResponse"); ajax.error(this, this.gotError); }, gotResponse: function(inSender, inResponse) { var output = ""; for(i = 0; i < inResponse.length; i++) { output += inResponse[i].Id + "
"; } output += Date.now(); this.$.repos.setContent(output); }, gotError: function(inSender, inError) { alert(inError); this.$.repos.setContent(inError + " " + Date.now()); }

});


Solution

  • Looks like a CORS issue. I see the following in the console:

    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin fiddle.jshell.net is therefore not allowed access.

    I wrapped it as a jsonp request successfully.

    http://jsfiddle.net/CPU8n/3/

    enyo.kind({
        name: "AjaxSample",
        components: [
            { kind: "Button", content: "Fetch Users", ontap: "fetch" },
            { name: "repos", content: "Not loaded...", allowHtml: true }
        ],
        fetch: function() {
            var ajax = new enyo.JsonpRequest({
                url: "http://jsonpwrapper.com/?urls%5B%5D=http%3A%2F%2Fatxapps.com%2F_sites%2Fatxapps.com%2Fdev%2Fjetstream%2Fassets%2FdataUsers.json"
            });
            ajax.go();
            ajax.response(this, "gotResponse");
            ajax.error(this, this.gotError);
        },
        gotResponse: function(inSender, inResponse) {
            var output = "";
            var body = enyo.json.parse(inResponse[0].body); // jsonpwrapper.com wraps the results in a array with an index for each URL. The actual data is in the body param of that index but it isn't parsed (at least in this example)
            for(i = 0; i < body.length; i++) {
                output += body[i].Id + "<br />";
            }
            output += Date.now();
            this.$.repos.setContent(output);
        },
        gotError: function(inSender, inError) {
            alert(inError);
            this.$.repos.setContent(inError + " " + Date.now());
        }
    
    });
    

    If you're running this on the same server in prod, you wouldn't see the error (since it's not cross-origin). If it'll be on a different server, you can either convert the server-side to support jsonp or adds the appropriate CORS headers.