如何为OSMDroid发起的请求添加HTTP请求头?
问题描述
我有客户的OpenStreetMap瓦片服务器,该服务器通过检查请求携带的Cookie头来识别客户端,相关格式如下:
请求头格式
Cookie: my_clients_company_cookie=0hPRvPfAK65TLASejXTtb6xjsRcH0D7t
请求示例
https://fleet.my_clients_company.com/tile?z=10&x=610&y=510
我当前使用的TileSource配置代码如下:
val tileSource: ITileSource get() = object : OnlineTileSourceBase( "My Client's Company", // name 3, // min zoom 18, // max zoom 512, // tile size ".png", arrayOf("https://fleet.my_clients_company.com/tile") ) { override fun getTileURLString(pMapTileIndex: Long): String = "$baseUrl?z=${MapTileIndex.getZoom(pMapTileIndex)}&x=${MapTileIndex.getX(pMapTileIndex)}&y=${MapTileIndex.getY(pMapTileIndex)}" }
不发送请求头时会收到401 Unauthorized错误响应,但我还没找到设置请求头的方法,请问无需fork库是否可以实现?
解决方案
无需fork osmdroid库,通过自定义OkHttpClient并注入到osmdroid的网络请求体系中即可实现添加Cookie请求头,步骤如下:
创建带Cookie拦截器的OkHttpClient
构建OkHttpClient时,添加拦截器为每个瓦片请求自动注入指定的Cookie头:val okHttpClient = OkHttpClient.Builder() .addInterceptor { chain -> val modifiedRequest = chain.request().newBuilder() .addHeader("Cookie", "my_clients_company_cookie=0hPRvPfAK65TLASejXTtb6xjsRcH0D7t") .build() chain.proceed(modifiedRequest) } .build()将自定义客户端注入osmdroid配置
在初始化地图控件前,通过osmdroid的全局配置替换默认的网络客户端:Configuration.getInstance().setHttpClient(OkHttpConnectionClient(okHttpClient))保留原有TileSource配置
你之前的TileSource代码无需修改,请求头的添加由拦截器统一处理,瓦片URL生成逻辑保持原样即可。
通过以上操作,所有瓦片请求都会自动携带指定的Cookie头,解决401授权问题,全程无需修改或forkosmdroid库。
内容的提问来源于stack exchange,提问作者Oleh Liskovych
相关产品推荐
相关产品推荐

