php jq jquery getJSON跨域提交数据完整版

PHP、jQuery、JSONP、CORS 跨域请求

在 Web 开发中经常会遇到跨域请求的场景,比如一个 Web 页面上需要通过 AJAX 请求外部的数据,或者我们需要调用第三方提供的接口。在跨域请求中,后端常用的解决方案包括 JSONP 和 CORS,前端常用的解决方案包括 Ajax 和 Fetch。

一、JSONP

JSONP(JSON with Padding) 是 json 的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据是一种非正式传输协议。

JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的 JSON 数据。

JSONP 的原理是动态添加 script 标签来进行跨域请求,使用 script 标签的时候浏览器会发出一次 GET 请求,这个 GET 请求会携带一个回调函数名,服务端需要根据这个回调函数名来返回对应的 JS 代码。

JSONP 的缺点在于只支持 GET 请求,不支持 POST 请求。

<?php
  $callback = $_GET['callback'];
  $data = array('name' => '张三', 'age' => 18);
  echo $callback . '('. json_encode($data) .')';
?>
$.ajax({
  url: 'http://localhost/data.php?callback=mycallback',
  dataType: 'jsonp',
  jsonpCallback: 'mycallback',
  success: function (data) {
    console.log(data);
  }
});

二、CORS

CORS(Cross-Origin Resource Sharing) 跨域资源共享,是一种机制,它使用额外的 HTTP 头来告诉浏览器,让运行在一个 origin (domain) 上的 Web 应用被准许访问来自不同源服务器上的指定的资源。

CORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。

服务端设置 Access-Control-Allow-Credentials: true 可以指定本次请求是否需要带上 cookie。

服务端设置 Access-Control-Expose-Headers: Authorization 可以让指定的 headers 可以被外部访问。

// PHP 后端示例
header('Access-Control-Allow-Origin: http://localhost:8000');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
header('Access-Control-Expose-Headers: Authorization');

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  exit; // finish preflight CORS requests here
}

$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$username = $request->username;

header('Content-type: application/json');
echo json_encode(array('state' => 'ok'));
// jQuery 前端示例
$.ajax({
  type: 'POST',
  url: 'http://localhost:8080/api/login',
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  },
  headers: {
    Authorization: 'Bearer ' + token
  },
  data: { username: 'test' },
  success: function (result) {
    console.log(result);
  }
});

三、POST 请求示例

$.ajax({
  type: 'POST',
  url: 'http://localhost:8080/api/login',
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  },
  headers: {
    Authorization: 'Bearer ' + token
  },
  data: { username: 'test' },
  success: function (result) {
    console.log(result);
  }
});

其中,withCredentials 表示是否允许携带 cookie。

四、GET 请求示例

$.ajax({
  type: 'GET',
  url: 'http://localhost:8080/api/users',
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  },
  headers: {
    Authorization: 'Bearer ' + token
  },
  data: { page: 1, limit: 10 },
  success: function (result) {
    console.log(result);
  }
});

五、总结

以上就是关于 PHP、jQuery、JSONP、CORS 跨域请求的相关内容。根据需求选择不同的解决方案,确保数据的安全和有效传输。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php jq jquery getJSON跨域提交数据完整版 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxMenu autoOpen属性

    以下是关于 jQWidgets jqxMenu 组件中 autoOpen 属性的详细攻略。 jQWidgets jqxMenu autoOpen 属性 jQWidgets jqxMenu 组件的 autoOpen 属性用于设置菜单是否在鼠标悬停自动打开。该属性默认值为 false,表示菜单不自动打开。 语法 $(‘#menu’).jqxMenu({ auto…

    jquery 2023年5月12日
    00
  • jQuery Mobile面板disabled选项

    下面为您详细讲解“jQuery Mobile面板disabled选项”的完整攻略。 1. disabled选项介绍 disabled选项是jQuery Mobile中用于禁用面板的属性。使用该属性可以禁止用户对面板进行任何操作,包括单击、滑动等。 disabled属性有两种状态,分别是true和false。 true代表禁用面板,false代表启用面板。默认…

    jquery 2023年5月12日
    00
  • jQuery 判断元素整理汇总

    现在我来详细讲解一下“jQuery 判断元素整理汇总”的完整攻略,包含以下几个部分: 基本概念:jQuery 判断元素是指通过 jQuery 选择器找到指定的元素,然后再通过不同的判断方法来判断这些元素是否符合要求。jQuery 判断元素的常用方法主要有以下几种:hasClass()、is()、filter()、find() 等。 hasClass()方法:…

    jquery 2023年5月28日
    00
  • jQWidgets jqxTooltip autoHideDelay属性

    以下是关于 jQWidgets jqxTooltip 组件中 autoHideDelay 属性的详细攻略。 jQWidgets jqxTooltip autoHideDelay 属性 jQWidgets jqxTooltip 组件的 autoHideDelay 属性用于设置提示框自动隐藏的延迟时间。可以使用该属性来控制提示框自动隐藏的速度和效果。 语法 $(…

    jquery 2023年5月11日
    00
  • jQWidgets jqxDocking pinWindow()方法

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxDocking,它是一个用于创建可拖动窗口的控件。jqxDocking 组件提供多个方法,其中之一是 pinWindow()。下面是关于 jqxDocking 的 pinWindow() 方法的详细攻略: pinWindow() 方法概述 …

    jquery 2023年5月11日
    00
  • jQuery Ajax中的事件详细介绍

    jQuery Ajax中的事件主要有以下几种: beforeSend(请求发送前) error(请求失败时) success(请求成功后) complete(请求完成后,无论成功或失败) statusCode(根据HTTP状态码进行处理) 下面我们对每个事件进行详细介绍,并提供相应的示例说明。 beforeSend 在发送实际请求之前,可以使用beforeS…

    jquery 2023年5月27日
    00
  • jQuery EasyUI Dialog拖不下来如何解决

    当在使用 jQuery EasyUI Dialog 插件时,有时会出现拖不下来的情况,这可能是由于 EasyUI Dialog 插件的配置或者代码实现中的问题导致的。以下是解决这个问题的完整攻略: 1. 检查 EasyUI Dialog 配置 我们可以在 EasyUI Dialog 的配置中添加 resizable 属性,设置为 true,以允许 Dialo…

    jquery 2023年5月18日
    00
  • 如何使用JQuery从select元素中获得N个选项

    使用JQuery从select元素中获得N个选项可以通过以下步骤实现: 步骤一:选择select元素 首先,我们需要选择页面上的select元素,并且将其存储到一个变量中。例如,如果我们的select元素的id为selectBox,可以使用以下代码选择该元素: var selectBox = $(‘#selectBox’); 步骤二:获取所有选项 接下来,我…

    jquery 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部