原生JS实现Ajax的跨域请求

原生JS如何实现Ajax的跨域请求?

在解决这个问题之前,我们务必先清楚为什么我们要跨域请求,以及在什么情况下会跨域请求。

了解一下:“同源策略”,你就知道了;

  同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。

  它的定义是:

    一段脚本向后台请求数据,只能读取属于同一协议名、同一主机名、同一端口号下的数据;

    所以,请求不同协议名、不同端口号、不同主机名下面的文件时,

  将会违背同源策略,无法请求成功,需要进行跨越处理!!

解决跨域请求的方法:

方法一:

  通过后台的PHP进行设置

  前台无需任何设置,在后台被请求的PHP文件中,写入一条header。

    header("Access-Control-Allow-Origin:*");    --- 表示允许哪些域名请求这个PHP文件,*表示所有域名都允许

JS代码:  

$.post("http://127.0.0.1/json.php",function(data){
   console.log(data);
});

注释:

  其中,url为PHP文件的路径;

PHP代码:

<?php
        header("Content-Tyepe:text/html;charset=utf-8");
        header("Access-Control-Allow-Origin:*");
        $str = <<<str
        [
         {
            "name":    "影子",
            "age":    17,
            "hobby":    [
                    "吃",
                    "喝",
                    "玩",
                    "乐"
            ],
            "score":{
                    "math":78,
                    "chinese":89
            }
        },
]
str;
echo $str;                                   

结果:

  

方法二:

  实现步骤: 

    1、原有src属性的标签子带跨域功能;所以可以使用script标签的src属性请求后台数据

       <script src="http://127.0.0.1/json.php">< /script>

    2、用于src在加载数据成功后,会直接将加载的内容放到script标签中;

         所以,后台直接返回JSON字符串将不能在script标签中解析。

       因此,后台应该返回给前台一个回调函数名,并将JSON字符串作为参数传入。

        后台PHP文件中返回: echo "callback({$json})";

     3、前台接收到返回的回调函数,将直接在script标签中调用。因此,需要声明这样一个回调函数,作为请求成功的回调

function callback(data){

    alert("请求成功!!");

    console.log(data);

}

JS代码:

<script type="text/javascript">
        function callback(data){
               console.log(data);
        }
</script>
<script src="http://127.0.0.1/json.php"></script>

PHP文件:

<?php
    header("Content-Tyepe:text/html;charset=utf-8");
    $str = <<<str
    [
    {
        "name":"yingzi",
        "age":17,
        "hobby":[
            "吃",
            "喝",
            "玩",
            "乐"
        ],
    }
]
str;
echo "callback({$str})";

结果:

方法三:

   1、在ajax请求时,设置dataType为"jsonp";

2、后台返回时,依然需要返回回调函数名,但是,ajax在发送请求时,会默认使用get请求将回调函数名发给后台,

     后台$_GET[‘callback‘] 取出函数名:

      ---   echo "{$_GET[‘callback‘]}({$str})";

3、后台返回以后,前台就可以使用ajax的success函数作为成功的回调

        ---    success : function(data){}

JS代码:

<script type="text/javascript">
    $.ajax({
        type:"post",
        url:"http://127.0.0.1/json.php",
        dataType:"jsonp",
        success:function(data){
            console.log(data);
        }
    });
</script>

PHP文件:

<?php
    header("Content-Tyepe:text/html;charset=utf-8");
    $str = <<<str
    [
    {
        "name":"yingzi",
        "age":17,
        "hobby":[
            "吃",
            "喝",
            "玩",
            "乐"
        ],
    }
]
str;
echo "{$_GET[‘callback‘]}({$str})";

结果:

当然,后台也可以随便返回一个函数名,前台只要请求成功,就会自动调用这个函数。类似第二条的②、③步,而不需要本方法的第③步

PHP返回: echo "callback({$str})";

JS代码:  function callback(data){

        console.log(data);

      }

JS代码:

<script type="text/javascript">
    $.ajax({
        type:"post",
        url:"http://127.0.0.1/json.php",
        dataType:"jsonp",
    });
    function(data){
        console.log(data);
    }
</script>

PHP文件:

<?php
    header("Content-Tyepe:text/html;charset=utf-8");
    $str = <<<str
    [
    {
        "name":"yingzi",
        "age":17,
        "hobby":[
            "吃",
            "喝",
            "玩",
            "乐"
        ],
    }
]
str;
echo "callback({$str})";

结果:

Web前端工程师,关于数据交互这一块,会用到的地方很多;这是大神“影子”的文章,我是无耻的搬运过来的,如果“影子”看到要求删除请联系我;下面附上“影子”的博客原文链接:https://www.cnblogs.com/2502778498spw/p/7784390.html

原文地址:https://www.cnblogs.com/Webzhoushifa/p/9426000.html

时间: 2024-11-04 02:45:02

原生JS实现Ajax的跨域请求的相关文章

原生JS实现Ajax及Ajax的跨域请求

  前  言          如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿.当然,如今有着许多的框架,都有相对应的前后台数据交互的方法. 而,其中,用得最多的应该苏算是JQuery的Ajax了.但是,今天,影子向大家介绍的是原生js的Ajax,及跨域请求. 一. JQuery的Ajax 首先,先回忆下JQuery的Ajax写法: $.ajax({ url: , type: '', dataType: '', data: { }, s

Ajax之跨域请求

一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径'http://127.0.0.1:8000/index/',对应的视图是index视图返回一个index页面,页面中只有一个button按钮,按钮绑定了一个单击事件,点击之后会发送一个ajax请求,请求的路径为'http://127.0.0.1:8001/ajax/',Demo1的ip和端口号是:'http://127.0.0.1:8000/',Demo2的ip和端口号是:'http://127.0

原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)

抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.

Ajax-07 基于Ajax实现跨域请求

跨域 跨域名访问,如c1.com域名向c2.com域名发送请求 本质:浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. django服务端准备 url.py: from django.conf.urls import url from hello import views urlpatterns = [ url(r'cors/', views.cors, name='cors'), url(r'jsonp/', views.jsonp, name=

ajax本地跨域请求以及解决方法

什么是跨域? ??我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没有同时满足这三个条件的请求即为跨域请求,跨域请求控制台一般会出现类似错误: XMLHttpRequest cannot load http://xxxxx.php. No 'Access-Control-Allow-Origin' header is present on the requested reso

ajax j跨域请求sonp

需求 遇到的问题 解决方案 需求 如今,该项目需要获得数据访问外部链接.它是跨域.使用ajax 直提示: 遇到的问题 1. 怎样使用ajax 跨域请求数据 2. 能不能post请求 解决的方法 经过网上查找资料.能使用jsonp请求跨域数据. jsonp请求数据仅仅能get.不支持post跨域请求 用法.见代码: $.ajax({ type: "post",//这里写post也没用,也是get请求 url: "url", dataType: "jsonp&

js之Ajax与跨域

一.Ajax 我们对Ajax一定不会陌生,异步发送请求获取数据,这是我们前端与后台服务器交互的重要的手段,那么对于ajax我们需要了解什么呢? 我们手写一个ajax,这样就能够基本了解使用了ajax了. 1 var xhr = new XMLHttpRequest(); // XMLHttpRequest是ajax最重要的api 2 3 xhr.open("GET", "/admin/user"); 4 5 xhr.onreadystatechange = func

Ajax JSON 跨域请求 服务(WebApi,WCF或者其他)

直接来干货. 程式在 单台IIS下工作正常,换到域名下(负载均衡)就开开各种跨域了.研究了下,只要是符合以下条件的,基本上可以通用一种解决方案: 条件是: 1. HTTP方法:GET,Head,POST之外的方法 2. 使用POST方法,而且使用application/x-www-form-urlencoded, multipart/form-data, or text/plain 之外的 Content-Type,例如:以 POST 发送XML.JSON 等 3. 使用自定义头 解决方案: 移

js,java,ajax实现跨域访问及其原理

http://blog.csdn.net/saytime/article/details/51540876 这篇文章对跨域访问做了较为细致得分析,我这里做下简单总结 1.实现跨域访问原理: 浏览器由于同源策略不能做跨域访问,但是<script>标签是开放策略能够跨域访问,所以突破口就是通过<script>来实现跨域访问获得其他地方得json数据 jsonp模式: JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的