Skip to content

Commit 5a1da9a

Browse files
committed
【feature】支持设置全局自定义RequestHeader;ol webmap 出图支持自定义的tileRequestParameters;review by luox
1 parent f99b3f0 commit 5a1da9a

File tree

6 files changed

+264
-16
lines changed

6 files changed

+264
-16
lines changed

src/common/index.common.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ import { ElasticSearch } from './thirdparty';
329329
import {
330330
isCORS,
331331
setCORS,
332+
setRequestHeaders,
332333
FetchRequest,
333334
ColorsPickerUtil,
334335
ArrayStatistic,
@@ -501,6 +502,7 @@ export { Format, GeoJSONFormat, JSONFormat, WKTFormat };
501502
export {
502503
isCORS,
503504
setCORS,
505+
setRequestHeaders,
504506
FetchRequest,
505507
EncryptRequest,
506508
getServiceKey,

src/common/namespace.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ import {
337337
ElasticSearch,
338338
isCORS,
339339
setCORS,
340+
setRequestHeaders,
340341
FetchRequest,
341342
EncryptRequest,
342343
getServiceKey,
@@ -497,6 +498,7 @@ SuperMap.setCORS = setCORS;
497498
SuperMap.isCORS = isCORS;
498499
SuperMap.setRequestTimeout = setRequestTimeout;
499500
SuperMap.getRequestTimeout = getRequestTimeout;
501+
SuperMap.setRequestHeaders = setRequestHeaders;
500502
SuperMap.FetchRequest = FetchRequest;
501503
SuperMap.EncryptRequest = EncryptRequest;
502504
SuperMap.getServiceKey = getServiceKey;

src/common/util/FetchRequest.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ export var RequestJSONPPromise = {
171171

172172
var CORS;
173173
var RequestTimeout;
174+
var RequestHeadersGetter;
174175
/**
175176
* @function setCORS
176177
* @description 设置是否允许跨域请求,全局配置,优先级低于 service 下的 crossOring 参数。
@@ -279,6 +280,43 @@ export var getRequestTimeout = function () {
279280
return RequestTimeout || 45000;
280281
}
281282

283+
/**
284+
* @function setRequestHeaders
285+
* @category BaseTypes Util
286+
* @description 设置请求自定义 request headers。
287+
* @param {function} func - 请求自定义 request headers 回调函数。
288+
* @usage
289+
* ```
290+
* // 浏览器
291+
<script type="text/javascript" src="{cdn}"></script>
292+
<script>
293+
const headers = function (url) { return { token: !!url }; };
294+
{namespace}.setRequestHeaders(headers);
295+
296+
</script>
297+
298+
// ES6 Import
299+
import { setRequestHeaders } from '{npm}';
300+
301+
const headers = function (url) { return { token: !!url }; };
302+
setRequestHeaders(headers);
303+
* ```
304+
*/
305+
export var setRequestHeaders = function (headers) {
306+
return RequestHeadersGetter = headers;
307+
}
308+
309+
/**
310+
* @private
311+
* @function getRequestTimeout
312+
* @category BaseTypes Util
313+
* @description 获取请求超时的时间。
314+
* @returns {number} 请求超时时间。
315+
*/
316+
export var getRequestHeaders = function () {
317+
return RequestHeadersGetter;
318+
}
319+
282320
/**
283321
* @name FetchRequest
284322
* @namespace
@@ -501,6 +539,11 @@ export var FetchRequest = {
501539
if (!options.headers['Content-Type'] && !FormData.prototype.isPrototypeOf(params)) {
502540
options.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
503541
}
542+
const customRequestHeadersGetter = getRequestHeaders();
543+
const customRequestHeaders = customRequestHeadersGetter && customRequestHeadersGetter(url);
544+
if (customRequestHeaders) {
545+
options.headers = Util.extend(options.headers, customRequestHeaders);
546+
}
504547
if (options.timeout) {
505548
return this._timeout(
506549
options.timeout,

src/common/util/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
isCORS,
77
setRequestTimeout,
88
getRequestTimeout,
9+
setRequestHeaders,
910
FetchRequest
1011
} from './FetchRequest';
1112

@@ -72,6 +73,7 @@ export {
7273
isCORS,
7374
setRequestTimeout,
7475
getRequestTimeout,
76+
setRequestHeaders,
7577
FetchRequest,
7678
EncryptRequest,
7779
getServiceKey,

src/openlayers/mapping/WebMap.js

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export class WebMap extends Observable {
130130
this.webMap = options.webMap;
131131
this.tileFormat = options.tileFormat && options.tileFormat.toLowerCase();
132132
this.restDataSingleRequestCount = options.restDataSingleRequestCount || 1000;
133+
this.tileRequestParameters = options.tileRequestParameters;
133134
this.createMap(options.mapSetting);
134135
if (this.webMap) {
135136
// webmap有可能是url地址,有可能是webmap对象
@@ -589,7 +590,8 @@ export class WebMap extends Observable {
589590
let options = {
590591
serverType,
591592
url,
592-
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid
593+
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid,
594+
tileLoadFunction: me.getCustomTileLoadFunction()
593595
};
594596
if (url && !CommonUtil.isInTheSameDomain(url) && !this.isIportalProxyServiceUrl(url)) {
595597
options.tileProxy = me.server + 'apps/viewer/getUrlResource.png?url=';
@@ -1176,6 +1178,36 @@ export class WebMap extends Observable {
11761178
break;
11771179
}
11781180
}
1181+
1182+
getCustomTileLoadFunction(transformImageUrl) {
1183+
const that = this;
1184+
if (this.tileRequestParameters) {
1185+
return function(imageTile, url) {
1186+
const src = transformImageUrl ? transformImageUrl(url) : url;
1187+
const requestParameters = that.tileRequestParameters(src);
1188+
if (requestParameters) {
1189+
FetchRequest.get(src, null, {
1190+
...requestParameters,
1191+
withoutFormatSuffix: true
1192+
})
1193+
.then(function (response) {
1194+
return response.blob();
1195+
})
1196+
.then(function (blob) {
1197+
const imageUrl = URL.createObjectURL(blob);
1198+
imageTile.getImage().src = imageUrl;
1199+
})
1200+
.catch(function (error) {
1201+
console.error('Error fetching the image:', error);
1202+
imageTile.setState('error');
1203+
});
1204+
} else {
1205+
imageTile.getImage().src = src;
1206+
}
1207+
}
1208+
}
1209+
}
1210+
11791211
/**
11801212
* @private
11811213
* @function WebMap.prototype.createXYZTileSource
@@ -1191,7 +1223,8 @@ export class WebMap extends Observable {
11911223
urls,
11921224
wrapX: false,
11931225
crossOrigin: 'anonymous',
1194-
tileGrid
1226+
tileGrid,
1227+
tileLoadFunction: this.getCustomTileLoadFunction()
11951228
});
11961229
}
11971230
/**
@@ -1224,7 +1257,8 @@ export class WebMap extends Observable {
12241257
// crossOrigin: 'anonymous', //在IE11.0.9600版本,会影响通过注册服务打开的iserver地图,不出图。因为没有携带cookie会报跨域问题
12251258
// extent: this.baseLayerExtent,
12261259
// prjCoordSys: {epsgCode: isBaseLayer ? layerInfo.projection.split(':')[1] : this.baseProjection.split(':')[1]},
1227-
format: layerInfo.format
1260+
format: layerInfo.format,
1261+
tileLoadFunction: this.getCustomTileLoadFunction()
12281262
};
12291263
if (!isBaseLayer && !this.isCustomProjection(this.baseProjection)) {
12301264
options.prjCoordSys = { epsgCode: this.baseProjection.split(':')[1] };
@@ -1338,7 +1372,8 @@ export class WebMap extends Observable {
13381372
return new XYZ({
13391373
url: layerInfo.url,
13401374
wrapX: false,
1341-
crossOrigin: 'anonymous'
1375+
crossOrigin: 'anonymous',
1376+
tileLoadFunction: this.getCustomTileLoadFunction()
13421377
});
13431378
}
13441379

@@ -1360,9 +1395,7 @@ export class WebMap extends Observable {
13601395
VERSION: layerInfo.version || '1.3.0'
13611396
},
13621397
projection: layerInfo.projection || that.baseProjection,
1363-
tileLoadFunction: function (imageTile, src) {
1364-
imageTile.getImage().src = src;
1365-
}
1398+
tileLoadFunction: this.getCustomTileLoadFunction()
13661399
});
13671400
}
13681401

@@ -1755,13 +1788,12 @@ export class WebMap extends Observable {
17551788
layerInfo.origin,
17561789
layerInfo.matrixIds
17571790
),
1758-
tileLoadFunction: function (imageTile, src) {
1791+
tileLoadFunction: this.getCustomTileLoadFunction(function (src) {
17591792
if (src.indexOf('tianditu.gov.cn') >= 0) {
1760-
imageTile.getImage().src = `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
1761-
return;
1793+
return `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
17621794
}
1763-
imageTile.getImage().src = src;
1764-
}
1795+
return src;
1796+
})
17651797
});
17661798
}
17671799

@@ -2956,13 +2988,15 @@ export class WebMap extends Observable {
29562988
};
29572989
let featureType = layerInfo.featureType;
29582990
let style = await StyleUtils.toOpenLayersStyle(this.getDataVectorTileStyle(featureType), featureType);
2991+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(layerInfo.url);
29592992
return new olLayer.VectorTile({
29602993
//设置避让参数
29612994
source: new VectorTileSuperMapRest({
29622995
url: layerInfo.url,
29632996
projection: layerInfo.projection,
29642997
tileType: 'ScaleXY',
2965-
format: format
2998+
format: format,
2999+
...requestParameters
29663000
}),
29673001
style: style
29683002
});
@@ -5123,7 +5157,6 @@ export class WebMap extends Observable {
51235157
* @param {Object} layerInfo - 图层信息
51245158
*/
51255159
createMVTLayer(layerInfo) {
5126-
// let that = this;
51275160
let styles = layerInfo.styles;
51285161
const indexbounds = styles && styles.metadata && styles.metadata.indexbounds;
51295162
const visibleResolution = this.createVisibleResolution(
@@ -5136,13 +5169,15 @@ export class WebMap extends Observable {
51365169
const styleResolutions = this.getStyleResolutions(envelope);
51375170
// const origin = [envelope.left, envelope.top];
51385171
let withCredentials = this.isIportalProxyServiceUrl(styles.sprite);
5172+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(styles.sprite);
51395173
// 创建MapBoxStyle样式
51405174
let mapboxStyles = new MapboxStyles({
51415175
style: styles,
51425176
source: styles.name,
51435177
resolutions: styleResolutions,
51445178
map: this.map,
5145-
withCredentials
5179+
withCredentials,
5180+
...requestParameters
51465181
});
51475182
return new Promise((resolve) => {
51485183
mapboxStyles.on('styleloaded', function () {
@@ -5158,7 +5193,8 @@ export class WebMap extends Observable {
51585193
format: new MVT({
51595194
featureClass: olRenderFeature
51605195
}),
5161-
wrapX: false
5196+
wrapX: false,
5197+
...requestParameters
51625198
}),
51635199
style: mapboxStyles.featureStyleFuntion,
51645200
visible: layerInfo.visible,

0 commit comments

Comments
 (0)