如何使 XMLHttpRequest 在谷歌浏览器上通过 HTTPS 工作?

Posted

技术标签:

【中文标题】如何使 XMLHttpRequest 在谷歌浏览器上通过 HTTPS 工作?【英文标题】:How to make XMLHttpRequest work over HTTPS on google chrome? 【发布时间】:2013-01-14 11:00:20 【问题描述】:

我对此进行了很多研究,但找不到魔法。 其实我想填充城市密码的列表。使用 JQuery 自动完成 UI。这是一个https页面。它适用于 Firefox,但不适用于 Google Chrome。谁能帮我解决这个问题。提前致谢。

以下是我的代码:

function zipAutoCompletet(prefix) 
    jQuery("#" + prefix + "_zip").autocomplete(
        source: function(request, response) 
            jQuery.ajax(
                url: "http://ws.geonames.org/postalCodeSearchJSON",
                dataType: "jsonp",
                data: 
                    style: "full",
                    maxRows: 12,
                    postalcode_startsWith: request.term
                ,
                success: function(data) 
                    response(
                        jQuery.map(data.postalCodes, function(item) 
                            return 
                                label:
                                    item.placeName +
                                    (item.adminCode1
                                        ? ", " + item.adminCode1
                                        : "") +
                                    ", " +
                                    item.postalCode +
                                    ", " +
                                    item.countryCode,
                                value: item.postalCode
                            ;
                        )
                    );
                    jQuery(".ui-autocomplete").css("width", "188px");
                
            );
        ,
        minLength: 2,
        select: function(event, ui) 
            var myString = new String(ui.item.label);
            var address = myString.split(",");

            jQuery("#" + prefix + "_city").val(address[0]);
            jQuery("#" + prefix + "_city").addClass("activated");
            jQuery("#" + prefix + "_city").trigger("change");
            jQuery("#" + prefix + "_city")
                .parents(".row")
                .removeClass("error-row");
            jQuery("#" + prefix + "_city")
                .parents(".row")
                .addClass("ok-row");

            var countryCode = address[3] ? address[3] : address[2];
            countryCode = jQuery.trim(countryCode);
            var countryName = jQuery(
                "#" +
                    prefix +
                    '_country option[value="' +
                    jQuery.trim(countryCode) +
                    '"]'
            ).text();
            jQuery("#countryContainer .jqTransformSelectWrapper span").html(
                countryName
            );
            jQuery("#countryContainer .jqTransformSelectWrapper").addClass(
                "selected-jqtranform"
            );
            jQuery("#" + prefix + "_country")
                .parents(".row")
                .addClass("ok-row");
            jQuery("#" + prefix + "_country")
                .parents(".row")
                .removeClass("error-row");
            jQuery("#" + prefix + "_country").val(jQuery.trim(countryCode));

            var stateCode = address[2] ? address[1] : "";
            stateCode = jQuery.trim(stateCode);

            if (countryCode == "US") 
                var base = base_url;
                base = base.replace("https", "http");

                jQuery.ajax(
                    url: base + "/getStateName",
                    dataType: "jsonp",
                    data:  stateCode: stateCode ,
                    success: function(data) 
                        stateName = data;

                        jQuery("#jc_state").val(stateName);
                        jQuery("#jc_state").addClass("activated");
                        jQuery("#jc_state")
                            .parents(".row")
                            .removeClass("error-row");
                        jQuery("#jc_state")
                            .parents(".row")
                            .addClass("ok-row");
                        jQuery("#jc_state").trigger("change");
                        formValidate();
                    
                );
             else 
                stateName = stateCode;

                jQuery("#jc_state").val(stateName);
                jQuery("#jc_state").addClass("activated");
                jQuery("#jc_state")
                    .parents(".row")
                    .removeClass("error-row");
                jQuery("#jc_state")
                    .parents(".row")
                    .addClass("ok-row");
                jQuery("#jc_state").trigger("change");
                formValidate();
            

            jQuery("#" + prefix + "_zip")
                .parents(".row")
                .addClass("ok-row");
            jQuery("#" + prefix + "_zip")
                .parents(".row")
                .removeClass("error-row");
        ,
        open: function() 
            jQuery(this)
                .removeClass("ui-corner-all")
                .addClass("ui-corner-top");
        ,
        close: function() 
            jQuery(this)
                .removeClass("ui-corner-top")
                .addClass("ui-corner-all");
        ,
        change: function(event, ui) 
            if (ui.item === null) 
                jQuery("#" + prefix + "_zip")
                    .parents(".row")
                    .removeClass("ok-row");
                jQuery("#" + prefix + "_zip")
                    .parents(".row")
                    .addClass("error-row");
                $("#" + prefix + "_zip").val("");
            
        
    );

【问题讨论】:

【参考方案1】:

如果您在 https 页面上,浏览器将阻止对非安全资源 (http) 的请求。 您应该经常看到一些关于此的通知。看起来其他浏览器默认不会阻止安全页面上的非安全 AJAX 请求,但 google chrome 会。

在您的代码中,您有硬编码的 URL:

url: "http://ws.geonames.org/postalCodeSearchJSON",

如果是跨域请求并且支持 HTTPS,你可以这样修改:

url: "//ws.geonames.org/postalCodeSearchJSON",

如您所见,此处未指定协议。浏览器将采用页面默认协议(http 或 https)并使用它来请求数据。

【讨论】:

感谢您的回复。这对我不起作用。有没有其他办法。 对我不起作用是什么意思?这种方法不能用还是试过了还是不行? 实际上,正如我所见,ws.geonames.org 的 HTTPS 存在一些问题(尝试打开 ws.geonames.org/postalCodeSearchJSON) - 你会看到一个警告。假设这就是为什么 ajax 也不起作用的原因。在这里您可以找到有关此问题的更多信息:***.com/questions/12216208/… 你是我的英雄,我有一个托管在http和https上的站点,它通过ajax调用托管在同一域的api。 api URL 在网站的配置中,但我不知道如何根据访问网站的协议使用适当的协议。这很有魅力。谢谢!

以上是关于如何使 XMLHttpRequest 在谷歌浏览器上通过 HTTPS 工作?的主要内容,如果未能解决你的问题,请参考以下文章

Json 文件不显示在谷歌浏览器中

在谷歌浏览器中使黄色自动完成透明[重复]

fetch和XMLHttpRequest

如何在谷歌浏览器中设置兼容性视图

如何使一个动态导入命令从一个表到另一个在谷歌的表

浏览器控制台报错SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3