Slim
Slim

Reputation: 1744

Strange parsing issue

I'm trying to send some data to a servlet and then to get back a .xls file from it. In order to do this, I'm using jquery, but I'm facing some strange issues. Let me explain.

Here is how I'm sending the data to the servlet and how I'm supposed to get the generated file back:

jQuery.download = function(url, data, method){
                        //url and data options required
                        if( url && data ){ 
                            //data can be string of parameters or array/object
                            data = typeof data == 'string' ? data : jQuery.param(data);
                            //split params into form inputs
                            var inputs = '';
                            jQuery.each(data.split('&'), function(){ 
                                var pair = this.split('=');
                                inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ pair[1] +'" />'; 
                            });
                            //send request
                            jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
                            .appendTo('body').submit().remove();
                        };
                    };

 download = function () {     
                        var a = this.mainData();        
                        var b = JSON.stringify(a);
                        console.log(b);
                        what = "test",
                            obj = $.extend({WrJOB: "xlsExport", mainData:  b}, tJS.getCommonPostData());                        
                        var data = $.param(obj); //.replace(/\+/g, '%20'); its just a test
                        $.download('/myapp/AppProxy', data);
                     },

A button in my html is calling the download function wich is sending some JSON data to the servlet. In my case it is var b.

I'm pretty sure that there is an encoding issue, but I have no idea how to fix it.

Please, help me with this strange problem, I'm already working many hours on it and I can not find a solution.

Upvotes: 1

Views: 82

Answers (4)

Roger Lindsj&#246;
Roger Lindsj&#246;

Reputation: 11553

The problem is that you urlencode your data twice. First explicitly in your javascript, then implicitly when creating the form. The browser will be "nice" to you and urlencode the input parameters before doing the request.

Either decode the parameters before adding them as input values or change the way you build your data to avoid the explicit encoding.

Upvotes: 1

bbokkun
bbokkun

Reputation: 191

like this

$.extend({URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;while(x<c.length){var m=r.exec(c.substr(x));  if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;  }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);  o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;},URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/;while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}});

jQuery.each(data.split('&'), function(){
   var pair = this.split('=');
   inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ jQuery.URLDecode(pair[1]) +'" />';         
});

Upvotes: 1

Matt Watson
Matt Watson

Reputation: 21

It looks like the servlet is receiving it encoded for a URL. You might be able to decode it on the servlet side if you have control over the code on the servlet.

For instance, in PHP, using urldecode()

Hope this helps.

Upvotes: 1

David Jashi
David Jashi

Reputation: 4511

You should unescape your output at some point. I would advise to do it on servlet side.

Upvotes: 1

Related Questions