zoukankan      html  css  js  c++  java
  • vue---$ajax

    Vue.js——基于$.ajax实现数据的跨域增删查改

    • 同源策略和跨域概念
    • 跨域资源共享
    • JSONP概念
    • REST Web Services
    • 基于$.ajax实现跨域GET请求
    • 基于$.ajax实现JSONP请求
    • 基于$.ajax实现跨域POST请求
    • 基于$.ajax实现跨域PUT请求
    • 基于$.ajax实现跨域DELETE请求

    1.同源策略Same-orgin policy)限制了一个源(orgin)中加载脚本或脚本与来自其他源(orgin)中资源的交互方式。
    如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于同一个源(orgin)。

    同源之外的请求都可以称之为跨域请求。

    我们可以简单粗暴地理解为同一站点下的资源相互访问都是同源的,跨站点的资源访问都是跨域的

    2.跨域资源共享JSONP不同,CORS除了支持GET方法以外,还支持其他HTTP方法

    3.JSONP概念

    由于同源策略,一般来说不允许JavaScript跨域访问其他服务器的页面对象,但是HTML的<script>元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON资料,而这种使用模式就是所谓的 JSONP JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

    4.REST Web Services简介

    HTTP协议是Web的标准之一,HTTP协议包含一些标准的操作方法,例如:GET, POST, PUT, Delete等,用这些方法能够实现对Web资源的CURD操作,下表列出了这些方法的操作定义。

    HTTP方法

    资源处理

    说明

    GET

    读取资源(Read)

    获取被请求URI(Request-URI)指定的信息(以实体的格式)。

    POST

    创建资源(Create)

    在服务器上创建一个新的资源,并返回新资源的URI。

    PUT

    更新资源(Update)

    指定URI资源存在则更新资源,指定URI资源不存在则创建一个新资源。

    DELETE

    删除资源(Delete)

    删除请求URI指定的资源。

    REST应用中,默认通过HTTP协议,并且使用GET、POST、PUT和DELETE方法对资源进行操作,这样的设计风格和Web标准完全契合。

    REST的最佳应用场景是公开服务,使用HTTP并遵循REST原则的Web服务,我们称之为RESTful Web Service。RESTful Web Service从以下三个方面进行资源定义:

    • 直观简短的资源地址:URI,比如:http://example.com/resources/
    • 传输的资源:Web Service接受与返回的互联网媒体类型,比如JSON,XML等
    • 对资源的操作:Web Service在该资源上所支持的一系列请求方法(比如:GET,POST,PUT或Delete)

    下图展示了RESTful Web Service的执行流程

    AjaxHelper

    基于$.ajax声明一个简单的AjaxHelper构造器,AjaxHelper构造器的原型对象包含5个方法,分别用于处理GET, POST, PUT, DELETE和JSONP请求。

    function AjaxHelper() {

    this.ajax = function(url, type, dataType, data, callback) {

    $.ajax({

    url: url,

    type: type,

    dataType: dataType,

    data: data,

    success: callback,

    error: function(xhr, errorType, error) {

    alert('Ajax request error, errorType: ' + errorType +  ', error: ' + error)

    }

    })

    }

    }

    AjaxHelper.prototype.get = function(url, data, callback) {

    this.ajax(url, 'GET', 'json', data, callback)

    }

    AjaxHelper.prototype.post = function(url, data, callback) {

    this.ajax(url, 'POST', 'json', data, callback)

    }

     

    AjaxHelper.prototype.put = function(url, data, callback) {

    this.ajax(url, 'PUT', 'json', data, callback)

    }

     

    AjaxHelper.prototype.delete = function(url, data, callback) {

    this.ajax(url, 'DELETE', 'json', data, callback)

    }

     

    AjaxHelper.prototype.jsonp = function(url, data, callback) {

    this.ajax(url, 'GET', 'jsonp', data, callback)

    }

     

    AjaxHelper.prototype.constructor = AjaxHelper

     

    实现GET请求

    发送get请求

    var ajaxHelper = new AjaxHelper()

     

    var demo = new Vue({

    el: '#app',

    data: {

    gridColumns: ['customerId', 'companyName', 'contactName', 'phone'],

    gridData: [],

    apiUrl: 'http://localhost:15341/api/Customers'

    },

    ready: function() {

    this.getCustomers()

    },

    methods: {

     

    getCustomers: function() {

    // 定义vm变量,让它指向this,this是当前的Vue实例

    var vm = this,

    callback = function(data) {

    // 由于函数的作用域,这里不能用this

    vm.$set('gridData', data)

    }

    ajaxHelper.get(vm.apiUrl, null, callback)

    }

    }

    })

    由于客户端和服务端Web API是分属于不同站点的,它们是不同的源,这构成了跨域请求。
    这时请求是失败的,浏览器会提示一个错误:
    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1::8020' is therefore not allowed access.         

    跨域解决方案

    现在碰到了请求跨域的问题,结合前面讲的一些概念,我们大致可以猜到解决跨域请求的两种方式:

    • 在服务端启用CORS。
    • 让无服务端拥有处理JSONP的能力。

    这两种跨域解决方案的区别是什么呢?

    • JSONP只支持GET请求;CORS则支持GET、POST、PUT、DELETE等标准的HTTP方法
    • 使用JSONP时,服务端要处理客户端请求的callback参数("callback"这个名称是可以指定的);而使用CORS则不需要提供这样的处理。
    • JSONP从服务端获取到的是script文件;CORS则是一段XML或JSON或其他格式的数据
    • JSONP支持IE8, IE9复古的浏览器;CORS则支持现代主流的浏览器

    选择JSONP还是CORS?除了极少数的情况,我们都应当选择CORS作为最佳的跨域解决方案。

     

     

  • 相关阅读:
    Leetcode 349. Intersection of Two Arrays
    hdu 1016 Prime Ring Problem
    map 树木品种
    油田合并
    函数学习
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 101. Symmetric Tree
    poj 2524 Ubiquitous Religions(宗教信仰)
    pat 1009. 说反话 (20)
  • 原文地址:https://www.cnblogs.com/benbenjia/p/12058710.html
Copyright © 2011-2022 走看看