[GIS] Geowebcache REST Truncate

geoservergeowebcache

I'm using geoserver with geowebcache and I need to use the REST API to truncate tiles in a bounding box so they can be rebuilt. All the examples in the documentation are in curl and I'm using JQuery. I'd like to do the call with $.ajax. Here's what I'm trying:

var formData = new FormData();

            formData.append("threadCount", "01");
            formData.append("type", "truncate");
            formData.append("gridSetID", "EPSG:900913");
            formData.append("format", "image/png");
            formData.append("zoomStart", '00');
            formData.append("zoomStop", '15');
            formData.append("minX", "-12484306.954023438");
            formData.append("minY", '3991847.3646093756');
            formData.append("maxX", "-12445171.195546875");
            formData.append("maxY", '4030983.1230859384');

            var data = {
                "threadCount": "01" ,
                "type": "truncate",
                "gridSetID": "EPSG:900913",
                "format": "image/png",
                "zoomStart": '00',
                "zoomStop": '15',
                "minX": "-12484306.954023438",
                "minY": '3991847.3646093756',
                "maxX": "-12445171.195546875",
                "maxY": '4030983.1230859384'
            };


            var ajaxResponse = $.ajax({
                type: "get",
                url: "http://localhost/geoserver/gwc/rest/seed/MyWorkspace:cityJoin",
                contentType: false,
                data: data,
                processData: true,
                cache: false
            });

I have tried several variations of this code. I've tried sending the formData and the data, get and post, and I've changed the contentType variable between false, multipart-form, and json. I've also had processData set to true and false and not included at all. I've also tried appending all the data to the url and sending it that way. The data I'm using comes from a call the Geowebcache seeding page makes. I get one of three results based on the settings I use: 1. the call goes through but no tiles get truncated. 2. Illegal Invocation error. 3. Internal server error. I can't get it to run the truncate. Does anyone have an example of how to run the truncate with $.ajax or have an idea why my code isn't working?

Best Answer

Some ideas but no definitive answer

If you read CURL below

curl -v -u geowebcache:secured -XPOST -H "Content-type: text/xml" -d '<seedRequest><name>nurc:Arc_Sample</name><srs><number>4326</number></srs><zoomStart>1</zoomStart><zoomStop>12</zoomStop><format>image/png</format><type>truncate</type><threadCount>2</threadCount></seedRequest>'  "http://localhost:8080/geowebcache/rest/seed/nurc:Arc_Sample.xml"
  • You must use POST because of "-XPOST" in CURL call
  • You don't have to use a FormData because your content is xml e.g CURL "Content-type: text/xml"
  • You have to send an XML so to build it, you do something like

var my_xml_string = "<seedRequest><name>nurc:Arc_Sample</name><srs><number>4326</number></srs><zoomStart>1</zoomStart><zoomStop>12</zoomStop><format>image/png</format><type>truncate</type><threadCount>2</threadCount></seedRequest>";

The result (tested)

// Function for sending authentication (to put in a separated js file in fact)
// From http://www.webtoolkit.info/javascript-base64.html

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}


var my_xml_string = "<seedRequest><name>nurc:Arc_Sample</name><srs><number>4326</number></srs><zoomStart>1</zoomStart><zoomStop>12</zoomStop><format>image/png</format><type>truncate</type><threadCount>2</threadCount></seedRequest>";

//Need some cleaning
$.ajax({
    url: "http://localhost/geowebcache/rest/seed/nurc:Arc_Sample.xml",
    data: my_xml_string, 
    type: 'POST',
    contentType: "text/xml",
    dataType: "xml",
    beforeSend : function(xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + Base64.encode("admin:geoserver"));
    },
    success : function (data, textStatus, jqXHR) {
       console.log(textStatus);
    },
    error : function (xhr, ajaxOptions, thrownError){  
        console.log(xhr.status);          
        console.log(thrownError);
    } 
});
Related Question