前言
ArcGIS API for JavaScript(後文簡稱 ags api)其實在17年底就接觸過,當時配置過這個代理,覺得很難。因爲當時還是做AE的(現在看來,那時候AE基本就是被淘汰了,Web端已經興起),對前端一無所知,學習一個月效果不好,就又做了幾個月的AE. 後來換了地方主要是做OpenLayers,直到20年初ags api又重新撿起來。所以現在讓我看到這個代理還是點陰影的。
背景
有一些點位數據,大概8萬多條,後端已經用arcgis server發佈。前端用 ags api實例化FeatureLayer調用,有個篩選的需求,我直接用了definitionExpression,
// Set the definition expression directly on layer instance to only display trees taller than 50ft layer.definitionExpression = "HEIGHT > 50";
類似上面,但是我的查詢條件要複雜些,長度比這個長很多。
環境
Windows Server 2012 R2
ArcGIS API for js 4.18
問題
或許就是因爲查詢條件過長的原因,導致查詢失敗,在前端篩選的時候可能缺失點位或者直接不顯示點位。這個問題我是在前端network裏面看到請求不到,也沒見到請求方式和狀態碼,所以讓人很迷。
然後我去arcgis server服務裏面查詢,用post方式是正常的:
但是用get方式直接跳轉到一個錯誤頁(這個問題之前是這樣,現在已經沒有了):
經過我的查找和思考,大概就是因爲查詢條件太長導致的(至今我也不確定,只能去嘗試),我還是嘗試下加代理的方式。
配置過程
以DotNet爲例
1.先到github下載文件
下載後包括ASP.NET、Java/JSP、PHP三個文件夾,我用的IIS,所以只需要用DotNet部分。(在github上Detnet文件夾點擊進去,裏面也有詳細配置教程)
2.將DotNet文件夾拷貝到服務器C:\inetpub\wwwroot。(這個路徑其實是任意的,放在這裏不容易被誤刪,另外就是可以使用默認端口。我的默認端口被佔用了,所以用了其它端口“8085”,但是爲了不誤導人,本教程就按照默認端口80寫的)
3.打開proxy.config文件,將“http://services.arcgisonline.com”改爲自己arcgis server的地址,比如:"http://10.93.2.108:6080/arcgis/rest/services"
<?xml version="1.0" encoding="utf-8" ?> <ProxyConfig allowedReferers="*" mustMatch="true" xmlns="proxy.xsd"> <serverUrls> <serverUrl url="http://services.arcgisonline.com" matchAll="true"/> </serverUrls> </ProxyConfig> <!-- See https://github.com/Esri/resource-proxy for more information -->
4.確保已經開啓了IIS,打開IIS管理器,右擊DotNet,選擇轉換爲應用程序
5.驗證是否通了
訪問http://10.93.2.108/DotNet/proxy.ashx?ping得到如下的結果,就說明代理是可用的
如果訪問這個頁面出現錯誤頁,比如錯誤碼爲403,可以嘗試以下方案:
①這裏是GitHub自述文件:
②另外還有一個地址,忘記參考哪個解決的了
然後驗證跟自己發佈的服務是否通了,訪問"http://10.93.2.108/DotNet/proxy.ashx?http://10.93.2.108:6080/arcgis/rest/services/?f=pjson",如果看到類似結果,說明通了:
至此,代理配置就完成了。
6.前端使用
require(["esri/config"], function(esriConfig) {
esriConfig.request.proxyUrl=" http://10.93.2.108:8085/DotNet/proxy.ashx";
});
7.前端調用結果
在某條提問的回答下我看到這麼一句話:“在代理文件中,沒有強制走post的設置。使用代理,如果需要走post請求,代理會自動走post,這個過程是自動進行的。目前在js api中,只有在使用task對象或者直接通過request提交請求時,纔可以通過RequestOptions參數設置請求強制走post,其他對應沒有設置的設置。”,說明走不走代理是自動的過程,我在network請求中也能看到這種現象:
初始請求,沒有走代理
篩選後,加了幾個條件,開始走代理了,但我們可以看到,請求方式依然是GET,這點我沒搞懂,說好的POST請求呢?
參考網址