11require ( "whatwg-fetch/fetch" ) ;
22var fetchJsonp = require ( 'fetch-jsonp/build/fetch-jsonp' ) ;
33
4+ SuperMap . Support = {
5+ cors : ( ( window . XMLHttpRequest && 'withCredentials' in new window . XMLHttpRequest ( ) ) )
6+ } ;
7+
48SuperMap . Request = SuperMap . Class ( {
59
610 initialize : function ( ) {
711 } ,
812
9- get : function ( url , params ) {
13+ get : function ( url , params , options ) {
14+ options = options || { } ;
1015 var type = 'GET' ;
11- return this . _processAsyn ( this . parseUrl ( url , params , type ) , type ) ;
16+ url = url . endWith ( '.json' ) ? url : url + '.json' ;
17+ url = params ? SuperMap . Util . urlAppend ( url , this . getParameterString ( params || { } ) ) : url ;
18+ var tokenParam = '' ;
19+ var separator = url . indexOf ( "?" ) > - 1 ? "&" : "?" ;
20+ if ( SuperMap . Credential . CREDENTIAL && SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ) {
21+ tokenParam = SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ;
22+ }
23+ var requestLength = url . length ;
24+ if ( requestLength <= 2000 ) {
25+ url = tokenParam !== '' ? url + separator + tokenParam : url ;
26+ if ( SuperMap . Support . cors ) {
27+ return this . _fetch ( url , params , options , type ) ;
28+ }
29+ if ( ! SuperMap . Util . isInTheSameDomain ( url ) ) {
30+ url = url . replace ( '.json' , '.jsonp' ) ;
31+ return this . _fetchJsonp ( url , options ) ;
32+ }
33+ }
34+ url = url . substring ( 0 , url . indexOf ( '?' ) ) + '_method= GET' ;
35+ url = tokenParam !== '' ? url + '&' + tokenParam : url ;
36+ return this . post ( url , params , options ) ;
1237 } ,
1338
14- delete : function ( url , params ) {
39+ delete : function ( url , params , options ) {
40+ options = options || { } ;
41+ url = url . endWith ( '.json' ) ? url : url + '.json' ;
1542 var type = 'DELETE' ;
16- return this . _processAsyn ( this . parseUrl ( url , params , type ) , type ) ;
43+ var requestLength = url . length ;
44+ url = params ? SuperMap . Util . urlAppend ( url , this . getParameterString ( params || { } ) ) : url ;
45+ var tokenParam = '' ;
46+ var separator = url . indexOf ( "?" ) > - 1 ? "&" : "?" ;
47+ if ( SuperMap . Credential . CREDENTIAL && SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ) {
48+ tokenParam = SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ;
49+ }
50+ if ( requestLength <= 2000 ) {
51+ if ( SuperMap . Support . cors ) {
52+ url = tokenParam !== '' ? url + separator + tokenParam : url ;
53+ return this . _fetch ( url , params , options , type ) ;
54+ }
55+ }
56+ url = url . substring ( 0 , url . indexOf ( '?' ) ) + '_method= DELETE' ;
57+ url = tokenParam !== '' ? url + '&' + tokenParam : url ;
58+ return this . post ( url , params , options ) ;
1759 } ,
1860
19- post : function ( url , params ) {
61+ post : function ( url , params , options ) {
62+ options = options || { } ;
2063 var type = 'POST' ;
21- return this . _processAsyn ( this . parseUrl ( url , params , type ) , type , params ) ;
64+ url = url . endWith ( '.json' ) ? url : url + '.json' ;
65+ var separator = url . indexOf ( "?" ) > - 1 ? "&" : "?" ;
66+ if ( SuperMap . Credential . CREDENTIAL && SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ) {
67+ url += separator + SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ;
68+ }
69+ return this . _fetch ( url , params , options , type ) ;
2270 } ,
2371
24- put : function ( url , params ) {
72+ put : function ( url , params , options ) {
73+ options = options || { } ;
2574 var type = 'PUT' ;
26- return this . _processAsyn ( this . parseUrl ( url , params , type ) , type , params ) ;
27- } ,
28-
29- parseUrl : function ( url , params , type ) {
30- url = url + '.json' ;
31- if ( SuperMap . Credential . CREDENTIAL ) {
32- url += '?' + SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ;
33- }
34- if ( type !== 'POST' && type !== 'PUT' && params && this . _parseParamsToString ( params ) !== '' ) {
35- params = this . toJSON ( params ) ;
36- url += '&' + this . _parseParamsToString ( params ) ;
75+ url = url . endWith ( '.json' ) ? url : url + '.json' ;
76+ var separator = url . indexOf ( "?" ) > - 1 ? "&" : "?" ;
77+ if ( SuperMap . Credential . CREDENTIAL && SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ) {
78+ url += separator + SuperMap . Credential . CREDENTIAL . getUrlParameters ( ) ;
3779 }
38- return url ;
80+ return this . _fetch ( url , params , options , type ) ;
3981 } ,
4082
41- _processAsyn : function ( url , type , params ) {
42- if ( ! SuperMap . Util . isInTheSameDomain ( url ) && type === 'GET' ) {
43- url = url . replace ( '.json' , '.jsonp' ) ;
44- return fetchJsonp ( url , { method : type } )
45- . then ( function ( response ) {
46- return response . json ( ) ;
47- } ) . then ( function ( json ) {
48- return json ;
49- } ) ;
50- }
51- if ( type === 'GET' || type === 'DELETE' ) {
52- return fetch ( url , { method : type } )
53- . then ( function ( response ) {
54- return response . json ( ) ;
55- } ) . then ( function ( json ) {
56- return json ;
57- } ) ;
83+ _fetch : function ( url , params , options , type ) {
84+ if ( options . timeout ) {
85+ return this . timeout ( options . timeout , fetch ( url , {
86+ method : type ,
87+ headers : options . headers ,
88+ body : type === 'PUT' || type === 'POST' ? params : undefined ,
89+ credentials : options . withCredentials ? 'include' : 'omit' ,
90+ mode : 'cors'
91+ } ) . then ( function ( response ) {
92+ return response . json ( ) ;
93+ } ) . then ( function ( json ) {
94+ return json ;
95+ } ) ) ;
5896 }
5997 return fetch ( url , {
6098 method : type ,
61- headers : {
62- "Content-Type" : "application/x-www-form-urlencoded"
63- } ,
64- body : JSON . stringify ( params )
99+ body : type === 'PUT' || type === 'POST' ? params : undefined ,
100+ headers : options . headers
101+ } ) . then ( function ( response ) {
102+ return response . json ( ) ;
103+ } ) . then ( function ( json ) {
104+ return json ;
65105 } )
106+ } ,
107+
108+ _fetchJsonp : function ( url , options ) {
109+ return fetchJsonp ( url , { method : 'GET' , timeout : options . timeout } )
66110 . then ( function ( response ) {
67111 return response . json ( ) ;
68112 } ) . then ( function ( json ) {
69113 return json ;
70114 } ) ;
71115 } ,
72116
73- _parseParamsToString : function ( queryParams ) {
74- var params = '' ;
75- if ( ! queryParams ) {
76- return params ;
77- }
78- var queryMap = { } ;
79- for ( key in queryParams ) {
80- if ( queryParams [ key ] instanceof Array ) {
81- queryMap [ key ] = this . _ArrayToString ( queryParams [ key ] ) ;
82- continue ;
83- }
84- queryMap [ key ] = queryParams [ key ] ;
85- }
86- for ( var i in queryMap ) {
87- params += i + '=' + queryMap [ i ] + '&' ;
88- }
89- return params . substring ( 0 , params . length - 1 ) ;
90- } ,
91-
92- _ArrayToString : function ( array ) {
93- if ( ! ( array instanceof Array ) ) {
94- return array ;
95- }
96- var arrayStr = '[' ;
97- for ( var i = 0 ; i < array . length ; i ++ ) {
98- if ( typeof array [ i ] !== 'string' ) {
99- return "[" + array . toString ( ) + "]" ;
100- }
101- arrayStr += "\"" + array [ i ] + "\"" ;
102- if ( i !== array . length - 1 ) {
103- arrayStr += ',' ;
104- continue ;
105- }
106- arrayStr += ']' ;
107- }
108- return arrayStr ;
117+ timeout : function ( seconds , promise ) {
118+ return new Promise ( function ( resolve , reject ) {
119+ setTimeout ( function ( ) {
120+ reject ( new Error ( "timeout" ) )
121+ } , seconds )
122+ promise . then ( resolve , reject )
123+ } )
109124 } ,
110125
111- toJSON : function ( object ) {
112- var json = { } ;
113- for ( var key in object ) {
114- if ( typeof object [ key ] === 'function' ) {
115- continue ;
126+ getParameterString : function ( params ) {
127+ var paramsArray = [ ] ;
128+ for ( var key in params ) {
129+ var value = params [ key ] ;
130+ if ( ( value != null ) && ( typeof value !== 'function' ) ) {
131+ var encodedValue ;
132+ if ( typeof value === 'object' && value . constructor === Array ) {
133+ var encodedItemArray = [ ] ;
134+ var item ;
135+ for ( var itemIndex = 0 , len = value . length ; itemIndex < len ; itemIndex ++ ) {
136+ item = value [ itemIndex ] ;
137+ encodedItemArray . push ( encodeURIComponent (
138+ ( item === null || item === undefined ) ? "" : item )
139+ ) ;
140+ }
141+ encodedValue = '[' + encodedItemArray . join ( "," ) + ']' ;
142+ }
143+ else {
144+ encodedValue = encodeURIComponent ( value ) ;
145+ }
146+ paramsArray . push ( encodeURIComponent ( key ) + "=" + encodedValue ) ;
116147 }
117- json [ key ] = object [ key ] ;
118148 }
119- return json ;
149+ return paramsArray . join ( "&" ) ;
120150 }
121151
122152} ) ;
123153
154+ String . prototype . endWith = function ( s ) {
155+ if ( s === null || s === "" || this . length === 0 || s . length > this . length )
156+ return false ;
157+ if ( this . substring ( this . length - s . length ) == s )
158+ return true ;
159+ else
160+ return false ;
161+ return true ;
162+ }
163+
124164module . exports = function ( ) {
125165 return new SuperMap . Request ( ) ;
126166} ;
0 commit comments