You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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请求头,步骤如下:

  1. 创建带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()
    
  2. 将自定义客户端注入osmdroid配置
    在初始化地图控件前,通过osmdroid的全局配置替换默认的网络客户端:

    Configuration.getInstance().setHttpClient(OkHttpConnectionClient(okHttpClient))
    
  3. 保留原有TileSource配置
    你之前的TileSource代码无需修改,请求头的添加由拦截器统一处理,瓦片URL生成逻辑保持原样即可。

通过以上操作,所有瓦片请求都会自动携带指定的Cookie头,解决401授权问题,全程无需修改或forkosmdroid库。

内容的提问来源于stack exchange,提问作者Oleh Liskovych

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:28