通过 AJAX 读取静态地图时的不安全标头警告

Posted

技术标签:

【中文标题】通过 AJAX 读取静态地图时的不安全标头警告【英文标题】:Unafe header waring when reading static map via AJAX 【发布时间】:2018-07-23 14:52:49 【问题描述】:

当我通过 AJAX 获取静态地图图像以检查错误时,我得到:

拒绝获取不安全的标头“x-staticmap-api-warning”

(在铬)

我对标头了解不多,但似乎必须在服务器上允许它们。这是正确的?或者有什么我可以做的吗?

为了完成我的代码:

getImageUrl(mapAddress) 
    return "https://maps.googleapis.com/maps/api/staticmap?center=" + encodeURIComponent(mapAddress) + "&markers=color:red%7C" + encodeURIComponent(mapAddress) + "&zoom=17&size=" + this.state.boxWidth + "x" + this.state.boxHeight + "&maptype=roadmap&key=" + GOOGLE_KEY;


getImage(mapAddress) 
    let url = this.getImageUrl(mapAddress);
    let xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);

    // Ask for the result as an ArrayBuffer.
    xhr.responseType = "arraybuffer";

    xhr.onload = (e) => 
        let warning;

        try 
            warning = xhr.getResponseHeader('x-staticmap-api-warning');
         catch (e) 

        if (warning && warning.indexOf('Error geocoding') === 0) 
            this.setState(
                imageFound: false,
                loading: false
            );
        
        else 
            let imageBlob = new Blob([new window.Uint8Array(xhr.response)]);
            let imageUrl = URL.createObjectURL(imageBlob);

            this.setState(
                imageFound: true,
                imageSrc: imageUrl,
                loading: false
            );
        
    ;
    xhr.send();

【问题讨论】:

您只是想在您的页面上显示静态地图图像吗?如果是这样,为什么不把网址放在 iframe 中。 我想在找到地址时显示地图。而且我不想在geo-API之前提出特殊要求。 和 iframe 一样:静态图像更快,因为我们要过渡到服务器端渲染,所以 iframe 根本不适合。 好吧,仍然没有解释你为什么要进行 ajax 请求,只需将你的 url 添加到 img 标签的 src 中:<img src="https://maps.googleapis.com/maps/api/staticmap?center=" + encodeURIComponent(mapAddress) + "&markers=color:red%7C" + encodeURIComponent(mapAddress) + "&zoom=17&size=" + this.state.boxWidth + "x" + this.state.boxHeight + "&maptype=roadmap&key=" + GOOGLE_KEY;/> 我确实想以我的风格向他们展示“找不到地址”,而不是带有黄色警告的空谷歌地图。静态地图在 x-staticmap-api-warning 标头中返回该错误.... 【参考方案1】:

OP 搞清楚了吗?

所有答案都不起作用,因为我和我也假设 OP,如果找不到地址,则只需不显示图像。

所以我们需要验证地址:

a) 首先通过地理编码地址来检查它是否有效 b) 或者监听来自静态映射的响应头。

似乎后者不是一个选项...只是作为谷歌处理静态地图服务错误的一种奇怪方式出现。

【讨论】:

我通过变通方法使它工作。我为此创建了服务器 API 函数。所以浏览器询问我的服务器 API,它从谷歌地图加载响应并将这个标题检查到我的心脏内容。并将结果返回给浏览器或错误信息。它不漂亮,但......它的工作原理。【参考方案2】:

我发现了问题所在,您的代码没有任何问题。问题是您在 (mapaddress) 中使用的 URL 地址不完整或缺少详细信息。

在Static Maps API - Error Messages 的文档中说:

对于某些错误情况,API 会返回地图,但地图中可能缺少某些信息。发生这种情况时,会出现两种情况来通知您警告。

一,地图显示,但有一个黄色的错误栏叠加在 地图顶部带有文本“地图错误:g.co/staticmaperror”。

两个, API 以名为的 HTTP 标头的形式返回警告 X-Staticmap-API-Warning。

我还尝试将您的 URL 替换为有效的地址,并且效果很好。

https://maps.googleapis.com/maps/api/staticmap?center=plaza+catalunya+barcelona&markers=color:red%7Cplaza+catalunya+barcelona&zoom=17&size=600x300&maptype=roadmap&key=YOUR_KEY

【讨论】:

以上是关于通过 AJAX 读取静态地图时的不安全标头警告的主要内容,如果未能解决你的问题,请参考以下文章

静态代码分析警告 CA2104 都有哪些安全问题?

渲染静态网站时的条件挂钩

返回静态变量时的线程安全

将项目中的标头包含到静态库中

java通过百度地图 获取静态图片 如何保存到本地

通过电子邮件发送谷歌静态地图