Skip to content

Commit a828bb0

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

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
@@ -131,6 +131,7 @@ export class WebMap extends Observable {
131131
this.webMap = options.webMap;
132132
this.tileFormat = options.tileFormat && options.tileFormat.toLowerCase();
133133
this.restDataSingleRequestCount = options.restDataSingleRequestCount || 1000;
134+
this.tileRequestParameters = options.tileRequestParameters;
134135
this.createMap(options.mapSetting);
135136
if (this.webMap) {
136137
// webmap有可能是url地址,有可能是webmap对象
@@ -590,7 +591,8 @@ export class WebMap extends Observable {
590591
let options = {
591592
serverType,
592593
url,
593-
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid
594+
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid,
595+
tileLoadFunction: me.getCustomTileLoadFunction()
594596
};
595597
if (url && !CommonUtil.isInTheSameDomain(url) && !this.isIportalProxyServiceUrl(url)) {
596598
options.tileProxy = me.server + 'apps/viewer/getUrlResource.png?url=';
@@ -1178,6 +1180,36 @@ export class WebMap extends Observable {
11781180
break;
11791181
}
11801182
}
1183+
1184+
getCustomTileLoadFunction(transformImageUrl) {
1185+
const that = this;
1186+
if (this.tileRequestParameters) {
1187+
return function(imageTile, url) {
1188+
const src = transformImageUrl ? transformImageUrl(url) : url;
1189+
const requestParameters = that.tileRequestParameters(src);
1190+
if (requestParameters) {
1191+
FetchRequest.get(src, null, {
1192+
...requestParameters,
1193+
withoutFormatSuffix: true
1194+
})
1195+
.then(function (response) {
1196+
return response.blob();
1197+
})
1198+
.then(function (blob) {
1199+
const imageUrl = URL.createObjectURL(blob);
1200+
imageTile.getImage().src = imageUrl;
1201+
})
1202+
.catch(function (error) {
1203+
console.error('Error fetching the image:', error);
1204+
imageTile.setState('error');
1205+
});
1206+
} else {
1207+
imageTile.getImage().src = src;
1208+
}
1209+
}
1210+
}
1211+
}
1212+
11811213
/**
11821214
* @private
11831215
* @function WebMap.prototype.createDynamicTiledSource
@@ -1208,7 +1240,8 @@ export class WebMap extends Observable {
12081240
// crossOrigin: 'anonymous', //在IE11.0.9600版本,会影响通过注册服务打开的iserver地图,不出图。因为没有携带cookie会报跨域问题
12091241
// extent: this.baseLayerExtent,
12101242
// prjCoordSys: {epsgCode: isBaseLayer ? layerInfo.projection.split(':')[1] : this.baseProjection.split(':')[1]},
1211-
format: layerInfo.format
1243+
format: layerInfo.format,
1244+
tileLoadFunction: this.getCustomTileLoadFunction()
12121245
};
12131246
if (!isBaseLayer && !this.isCustomProjection(this.baseProjection)) {
12141247
options.prjCoordSys = { epsgCode: this.baseProjection.split(':')[1] };
@@ -1322,7 +1355,8 @@ export class WebMap extends Observable {
13221355
return new XYZ({
13231356
url: layerInfo.url,
13241357
wrapX: false,
1325-
crossOrigin: 'anonymous'
1358+
crossOrigin: 'anonymous',
1359+
tileLoadFunction: this.getCustomTileLoadFunction()
13261360
});
13271361
}
13281362

@@ -1368,7 +1402,8 @@ export class WebMap extends Observable {
13681402
wrapX: false,
13691403
crossOrigin: 'anonymous',
13701404
tileGrid: this._getTileGrid({ origin, resolutions, tileSize }),
1371-
projection: this.baseProjection
1405+
projection: this.baseProjection,
1406+
tileLoadFunction: this.getCustomTileLoadFunction()
13721407
};
13731408
return new XYZ(options);
13741409
}
@@ -1399,9 +1434,7 @@ export class WebMap extends Observable {
13991434
VERSION: layerInfo.version || '1.3.0'
14001435
},
14011436
projection: layerInfo.projection || that.baseProjection,
1402-
tileLoadFunction: function (imageTile, src) {
1403-
imageTile.getImage().src = src;
1404-
}
1437+
tileLoadFunction: this.getCustomTileLoadFunction()
14051438
});
14061439
}
14071440

@@ -1794,13 +1827,12 @@ export class WebMap extends Observable {
17941827
layerInfo.origin,
17951828
layerInfo.matrixIds
17961829
),
1797-
tileLoadFunction: function (imageTile, src) {
1830+
tileLoadFunction: this.getCustomTileLoadFunction(function (src) {
17981831
if (src.indexOf('tianditu.gov.cn') >= 0) {
1799-
imageTile.getImage().src = `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
1800-
return;
1832+
return `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
18011833
}
1802-
imageTile.getImage().src = src;
1803-
}
1834+
return src;
1835+
})
18041836
});
18051837
}
18061838

@@ -2996,13 +3028,15 @@ export class WebMap extends Observable {
29963028
};
29973029
let featureType = layerInfo.featureType;
29983030
let style = await StyleUtils.toOpenLayersStyle(this.getDataVectorTileStyle(featureType), featureType);
3031+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(layerInfo.url);
29993032
return new olLayer.VectorTile({
30003033
//设置避让参数
30013034
source: new VectorTileSuperMapRest({
30023035
url: layerInfo.url,
30033036
projection: layerInfo.projection,
30043037
tileType: 'ScaleXY',
3005-
format: format
3038+
format: format,
3039+
...requestParameters
30063040
}),
30073041
style: style
30083042
});
@@ -5119,7 +5153,6 @@ export class WebMap extends Observable {
51195153
* @param {Object} layerInfo - 图层信息
51205154
*/
51215155
createMVTLayer(layerInfo) {
5122-
// let that = this;
51235156
let styles = layerInfo.styles;
51245157
const indexbounds = styles && styles.metadata && styles.metadata.indexbounds;
51255158
const visibleResolution = this.createVisibleResolution(
@@ -5132,13 +5165,15 @@ export class WebMap extends Observable {
51325165
const styleResolutions = this.getStyleResolutions(envelope);
51335166
// const origin = [envelope.left, envelope.top];
51345167
let withCredentials = this.isIportalProxyServiceUrl(styles.sprite);
5168+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(styles.sprite);
51355169
// 创建MapBoxStyle样式
51365170
let mapboxStyles = new MapboxStyles({
51375171
style: styles,
51385172
source: styles.name,
51395173
resolutions: styleResolutions,
51405174
map: this.map,
5141-
withCredentials
5175+
withCredentials,
5176+
...requestParameters
51425177
});
51435178
return new Promise((resolve) => {
51445179
mapboxStyles.on('styleloaded', function () {
@@ -5154,7 +5189,8 @@ export class WebMap extends Observable {
51545189
format: new MVT({
51555190
featureClass: olRenderFeature
51565191
}),
5157-
wrapX: false
5192+
wrapX: false,
5193+
...requestParameters
51585194
}),
51595195
style: mapboxStyles.featureStyleFuntion,
51605196
visible: layerInfo.visible,

0 commit comments

Comments
 (0)