重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

php跨域写json数据,跨域获取json数据

怎么解决跨域问题

1、 通过jsonp跨域

创新互联是一家集网站建设,高唐企业网站建设,高唐品牌网站建设,网站定制,高唐网站建设报价,网络营销,网络优化,高唐网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法,

JSON、JSONP的区别:

1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)

2、JSONP 只支持get请求、不支持post请求

(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

2、代理:

需要调用,可以写一个接口,由这个接口在后端去调用并拿到返回值,然后再返回给index.html

3、PHP端修改header

header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问

header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式

4、document.domain

跨域分为两种,一种xhr不能访问不同源的文档,另一种是不同window之间不能进行交互操作;

document.domain主要是解决第二种情况,且只能适用于主域相同子域不同的情况;

document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a.b.example.com中某个文档的document.domain可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。

兼容性:所有浏览器都支持;

优点:

 可以实现不同window之间的相互访问和操作;

缺点:

 只适用于父子window之间的通信,不能用于xhr;

 只能在主域相同且子域不同的情况下使用;

使用方式:

 不同的框架之间是可以获取window对象的,但却无法获取相应的属性和方法。比如,有一个页面,它的地址是 , 在这个页面里面有一个iframe,它的src是, 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:

script type="text/javascript"

function test(){

var iframe = document.getElementById('ifame');

var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的

var doc = win.document;//这里获取不到iframe里的document对象

var name = win.name;//这里同样获取不到window对象的name属性

}

/script

iframe id = "iframe" src="" onload = "test()"/iframe

这个时候,document.domain就可以派上用场了,我们只要把 和 这两个页面的document.domain都设成相同的域名就可以了。

1.在页面 中设置document.domain:

iframe id = "iframe" src="" onload = "test()"/iframe

script type="text/javascript"

document.domain = 'example.com';//设置成主域

function test(){

alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象

}

/script

2.在页面 中也设置document.domain:

script type="text/javascript"

document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同

/script

5、window.name

关键点:window.name在页面的生命周期里共享一个window.name;

兼容性:所有浏览器都支持;

优点:

 最简单的利用了浏览器的特性来做到不同域之间的数据传递;

 不需要前端和后端的特殊配制;

缺点:

 大小限制:window.name最大size是2M左右,不同浏览器中会有不同约定;

 安全性:当前页面所有window都可以修改,很不安全;

 数据类型:传递数据只能限于字符串,如果是对象或者其他会自动被转化为字符串,如下;

 这里写图片描述

使用方式:修改window.name的值即可;

6、postMessage

关键点:

 postMessage是h5引入的一个新概念,现在也在进一步的推广和发展中,他进行了一系列的封装,我们可以通过window.postMessage的方式进行使用,并可以监听其发送的消息;

兼容性:移动端可以放心用,但是pc端需要做降级处理

优点

 不需要后端介入就可以做到跨域,一个函数外加两个参数(请求url,发送数据)就可以搞定;

 移动端兼容性好;

缺点

 无法做到一对一的传递方式:监听中需要做很多消息的识别,由于postMessage发出的消息对于同一个页面的不同功能相当于一个广播的过程,该页面的所有onmessage都会收到,所以需要做消息的判断;

安全性问题:三方可以通过截获,注入html或者脚本的形式监听到消息,从而能够做到篡改的效果,所以在postMessage和onmessage中一定要做好这方面的限制;

 发送的数据会通过结构化克隆算法进行序列化,所以只有满足该算法要求的参数才能够被解析,否则会报错,如function就不能当作参数进行传递;

使用方式:通信的函数,sendMessage负责发送消息,bindEvent负责消息的监听并处理,可以通过代码来做一个大致了解;

Storage.prototype.sendMessage_ = function(type, params, fn) {

if (this.topWindow) {

this.handleCookie_(type, params, fn);

return;

}

var eventId = this.addToQueue_(fn, type);

var storageIframe = document.getElementById('mip-storage-iframe');

var element = document.createElement("a");

element.href = this.origin;

var origin = element.href.slice(0, element.href.indexOf(element.pathname) + 1);

storageIframe.contentWindow.postMessage({

type: type,

params: params,

eventId: eventId

}, origin);

}

Storage.prototype.bindEvent_ = function() {

window.onmessage = function (res) {

// 判断消息来源

if (window == res.source.window.parent

res.data.type === this.messageType.RES

window.location.href.match(res.origin.host).length 0) {

var fn = this.eventQueue[res.data.eventId];

fn fn();

delete this.eventQueue[res.data.eventId];

// reset id

var isEmpty = true;

for (var t in this.eventQueue) {

isEmpty = false;

}

if (isEmpty) {

this.id = 0;

}

}

}.bind(this);

}

PHP跨域获取json数据的方法,PHP里面有没有类似ajax的函数?

php中的文件读写函数基本上都可直接支持url,也就是说你可以像操作本地文件一样直接操作其他网站的文件(当然只是读取,写入是不可能的),而且没有任何跨域限制,比如下面一行代码就可直接读取百度首页的html代码:

$bd=file_get_contents("");

如果想获取json数据,只需把网址换一下即可。当然,还需要做一下格式转换,php本身就有专门的json转换函数:

$json=json_decode(file_get_contents("网址"),true);

这样一看,是不是比前端的ajax还要简单百倍?!

PHP如何实现跨域传递参数

通常是用json,你可以用php的函数json_encode(),转换为json格式,然后输出进行传递

thinkphp 跨域获取 xml 转 json

最简单的转换:

function simplest_xml_to_array($xmlstring) {

return json_decode(json_encode((array) simplexml_load_string($xmlstring)), true);

}

完整点的:

function xml2array($contents, $get_attributes=1, $priority = 'tag') {

if(!$contents) return array();

if(!function_exists('xml_parser_create')) {

//print "'xml_parser_create()' function not found!";

return array();

}

//Get the XML parser of PHP - PHP must have this module for the parser to work

$parser = xml_parser_create('');

xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); #

xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

xml_parse_into_struct($parser, trim($contents), $xml_values);

xml_parser_free($parser);

if(!$xml_values) return;//Hmm...

//Initializations

$xml_array = array();

$parents = array();

$opened_tags = array();

$arr = array();

$current = $xml_array; //Refference

//Go through the tags.

$repeated_tag_index = array();//Multiple tags with same name will be turned into an array

foreach($xml_values as $data) {

unset($attributes,$value);//Remove existing values, or there will be trouble

//This command will extract these variables into the foreach scope

// tag(string), type(string), level(int), attributes(array).

extract($data);//We could use the array by itself, but this cooler.

$result = array();

$attributes_data = array();

if(isset($value)) {

if($priority == 'tag') $result = $value;

else $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode

}

//Set the attributes too.

if(isset($attributes) and $get_attributes) {

foreach($attributes as $attr = $val) {

if($priority == 'tag') $attributes_data[$attr] = $val;

else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'

}

}

//See tag status and do the needed.

if($type == "open") {//The starting of the tag 'tag'

$parent[$level-1] = $current;

if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag

$current[$tag] = $result;

if($attributes_data) $current[$tag. '_attr'] = $attributes_data;

$repeated_tag_index[$tag.'_'.$level] = 1;

$current = $current[$tag];

} else { //There was another element with the same tag name

if(isset($current[$tag][0])) {//If there is a 0th element it is already an array

$current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;

$repeated_tag_index[$tag.'_'.$level]++;

} else {//This section will make the value an array if multiple tags with the same name appear together

$current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array

$repeated_tag_index[$tag.'_'.$level] = 2;

if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well

$current[$tag]['0_attr'] = $current[$tag.'_attr'];

unset($current[$tag.'_attr']);

}

}

$last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;

$current = $current[$tag][$last_item_index];

}

} elseif($type == "complete") { //Tags that ends in 1 line 'tag /'

//See if the key is already taken.

if(!isset($current[$tag])) { //New Key

$current[$tag] = $result;

$repeated_tag_index[$tag.'_'.$level] = 1;

if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;

} else { //If taken, put all things inside a list(array)

if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array...

// ...push the new element into that array.

$current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;

if($priority == 'tag' and $get_attributes and $attributes_data) {

$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;

}

$repeated_tag_index[$tag.'_'.$level]++;

} else { //If it is not an array...

$current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value

$repeated_tag_index[$tag.'_'.$level] = 1;

if($priority == 'tag' and $get_attributes) {

if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well

$current[$tag]['0_attr'] = $current[$tag.'_attr'];

unset($current[$tag.'_attr']);

}

if($attributes_data) {

$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;

}

}

$repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken

}

}

} elseif($type == 'close') { //End of tag '/tag'

$current = $parent[$level-1];

}

}

return($xml_array);

}

?

函数描述及例子

$arr = xml2array(file_get_contents("tools.xml"),1,'attribute');

JSON怎么跨域 - PHP进阶讨论

可以直接用原帖由 于 2007-10-19 13:28 发表 [i][/url]不能用代理因为是别人从我的服务器获取数据,我不能强迫别人在他自己的服务器上设置代理也可以说是AJAX跨域,只是听说用JSON代理XML更方便些 [/b]这个代理不是指浏览器的代理服务器,而是JSON怎么跨域 - PHP进阶讨论


新闻标题:php跨域写json数据,跨域获取json数据
分享路径:http://cqcxhl.com/article/heeiid.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP