Skip to content

Commit 1c36f7d

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

File tree

6 files changed

+331
-83
lines changed

6 files changed

+331
-83
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.createDynamicTiledSource
@@ -1206,7 +1238,8 @@ export class WebMap extends Observable {
12061238
// crossOrigin: 'anonymous', //在IE11.0.9600版本,会影响通过注册服务打开的iserver地图,不出图。因为没有携带cookie会报跨域问题
12071239
// extent: this.baseLayerExtent,
12081240
// prjCoordSys: {epsgCode: isBaseLayer ? layerInfo.projection.split(':')[1] : this.baseProjection.split(':')[1]},
1209-
format: layerInfo.format
1241+
format: layerInfo.format,
1242+
tileLoadFunction: this.getCustomTileLoadFunction()
12101243
};
12111244
if (!isBaseLayer && !this.isCustomProjection(this.baseProjection)) {
12121245
options.prjCoordSys = { epsgCode: this.baseProjection.split(':')[1] };
@@ -1320,7 +1353,8 @@ export class WebMap extends Observable {
13201353
return new XYZ({
13211354
url: layerInfo.url,
13221355
wrapX: false,
1323-
crossOrigin: 'anonymous'
1356+
crossOrigin: 'anonymous',
1357+
tileLoadFunction: this.getCustomTileLoadFunction()
13241358
});
13251359
}
13261360

@@ -1339,7 +1373,8 @@ export class WebMap extends Observable {
13391373
urls,
13401374
wrapX: false,
13411375
crossOrigin: 'anonymous',
1342-
tileGrid
1376+
tileGrid,
1377+
tileLoadFunction: this.getCustomTileLoadFunction()
13431378
});
13441379
}
13451380

@@ -1361,9 +1396,7 @@ export class WebMap extends Observable {
13611396
VERSION: layerInfo.version || '1.3.0'
13621397
},
13631398
projection: layerInfo.projection || that.baseProjection,
1364-
tileLoadFunction: function (imageTile, src) {
1365-
imageTile.getImage().src = src;
1366-
}
1399+
tileLoadFunction: this.getCustomTileLoadFunction()
13671400
});
13681401
}
13691402

@@ -1756,13 +1789,12 @@ export class WebMap extends Observable {
17561789
layerInfo.origin,
17571790
layerInfo.matrixIds
17581791
),
1759-
tileLoadFunction: function (imageTile, src) {
1792+
tileLoadFunction: this.getCustomTileLoadFunction(function (src) {
17601793
if (src.indexOf('tianditu.gov.cn') >= 0) {
1761-
imageTile.getImage().src = `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
1762-
return;
1794+
return `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
17631795
}
1764-
imageTile.getImage().src = src;
1765-
}
1796+
return src;
1797+
})
17661798
});
17671799
}
17681800

@@ -2958,13 +2990,15 @@ export class WebMap extends Observable {
29582990
};
29592991
let featureType = layerInfo.featureType;
29602992
let style = await StyleUtils.toOpenLayersStyle(this.getDataVectorTileStyle(featureType), featureType);
2993+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(layerInfo.url);
29612994
return new olLayer.VectorTile({
29622995
//设置避让参数
29632996
source: new VectorTileSuperMapRest({
29642997
url: layerInfo.url,
29652998
projection: layerInfo.projection,
29662999
tileType: 'ScaleXY',
2967-
format: format
3000+
format: format,
3001+
...requestParameters
29683002
}),
29693003
style: style
29703004
});
@@ -5081,7 +5115,6 @@ export class WebMap extends Observable {
50815115
* @param {Object} layerInfo - 图层信息
50825116
*/
50835117
createMVTLayer(layerInfo) {
5084-
// let that = this;
50855118
let styles = layerInfo.styles;
50865119
const indexbounds = styles && styles.metadata && styles.metadata.indexbounds;
50875120
const visibleResolution = this.createVisibleResolution(
@@ -5094,13 +5127,15 @@ export class WebMap extends Observable {
50945127
const styleResolutions = this.getStyleResolutions(envelope);
50955128
// const origin = [envelope.left, envelope.top];
50965129
let withCredentials = this.isIportalProxyServiceUrl(styles.sprite);
5130+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(styles.sprite);
50975131
// 创建MapBoxStyle样式
50985132
let mapboxStyles = new MapboxStyles({
50995133
style: styles,
51005134
source: styles.name,
51015135
resolutions: styleResolutions,
51025136
map: this.map,
5103-
withCredentials
5137+
withCredentials,
5138+
...requestParameters
51045139
});
51055140
return new Promise((resolve) => {
51065141
mapboxStyles.on('styleloaded', function () {
@@ -5116,7 +5151,8 @@ export class WebMap extends Observable {
51165151
format: new MVT({
51175152
featureClass: olRenderFeature
51185153
}),
5119-
wrapX: false
5154+
wrapX: false,
5155+
...requestParameters
51205156
}),
51215157
style: mapboxStyles.featureStyleFuntion,
51225158
visible: layerInfo.visible,

0 commit comments

Comments
 (0)