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作为最佳的跨域解决方案。

     

     

  • 相关阅读:
    tomcat8.5.57源码阅读笔记2
    tomcat8.5.57源码阅读笔记1
    KVM openstack
    爬虫进阶版
    react 之setChild子组件传值父组件
    Linux找死锁、cpu100%
    Java定时任务
    Java工具类HttpUtil
    Java后台远程下载url文件并远程上传文件
    jQuery上传文件
  • 原文地址:https://www.cnblogs.com/benbenjia/p/12058710.html
Copyright © 2011-2022 走看看