美文网首页Ajax
JSONP 跨域 & 制作手机号归属地查询

JSONP 跨域 & 制作手机号归属地查询

作者: CondorHero | 来源:发表于2019-04-29 22:09 被阅读6次

一、跨域

同源策略指域名,协议,端口相同。所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西。

同源策略
Ajax 请求 $.get(url,callback); URL的内容只能是同源策略的东西。如果想请求不是同源的东西只能进行跨域JSONP(JSON with padding)请求。
使用方法在index.html 文件引包 js 文件。但是,调用JavaScript文件好像没有受到跨域的影响(其实但凡只要拥有src属性的都拥有跨域的能力,例如<\script>、<\img>、<\iframe>)

方法

index.html文件跨域引包的文件必须放在下面,因为函数无法提升。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跨域JSONP</title>
</head>
<body>

    <script>
        //定义函数
        function fun(str){
            alert("成功跨域!");
        }
    </script>
    <!-- 跨域引包 -->
    <script src="js/JSONP.js"></script>
</body>
</html>

js 文件

fun();//如果在fun的括号里放入json,是不是妥妥的Ajax请求到了json

实验结果


实验结果

说明:本例也可以把定义和调用函数调换。引包位置可以任意,也就是讲函数可以提升。

演示不同源请求数据

index.html文件跨域引包的文件必须放在下面,因为函数无法提升。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跨域JSONP</title>
</head>
<body>

    <script>
        //定义函数
        function fun(str){
            alert(str.name);
        }
    </script>
    <!-- 跨域引包 -->
    <script src="js/JSONP.js"></script>
</body>
</html>

js 文件

fun({"name":"跨域","age":18});
结果

说明: 引包的地址换成你想要的任何网址,不就可以偷别人的借口了。哈哈哈哈哈

二、制作手机号归属地查询

浏览器提示错误:

  • Warning: file_get_contents(www.163.com): failed to open stream: No such file or directory in D:\PHPstudy\WWW\12\phone.php on line 5
<?php
echo file_get_contents("www.163.com");  
?>

解决办法:www.163.comhttp://www.163.com

  • Warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in D:\PHPstudy\WWW\12\phone.php on line 5
    Warning: file_get_contents(https://chongzhi.jd.com/json/order/search_searchPhone.action?mobile=18297806543): failed to open stream: No error in D:\PHPstudy\WWW\12\phone.php on line 5
    一共两个错误,其实只有第一个有用。错误显示HTTPS未启动,其实就是不支持HTTPS。

解决办法:我使用的本地服务器模拟软件是PHPstudy,我们只需要找到phpstudy的安装目录下的PHP文件夹,打开正在使用的PHP版本文件夹,找到 php.ini 文件,在文件中找到“;extension=php_openssl.dll”,去掉前面的分号重启软件就可以了。

补充:如果我们输入的网址是http://chongzhi.jd.com/json/order/search_searchPhone.action?mobile=18297806543
会提示如下错误,错误信息不一样但解决办法一样,如上。
Warning: file_get_contents(http://chongzhi.jd.com/json/order/search_searchPhone.action?mobile=18297806543): failed to open stream: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? in D:\PHPstudy\WWW\12\phone.php on line 5

  • 完成上步输出结果为:{"area":"14","areaName":"����","providerName":"�ƶ�","provider":1}
<?php
//字体乱码,设置字体
header("Content-Type:application/json;charset=GBK");
echo file_get_contents("https://chongzhi.jd.com/json/order/search_searchPhone.action?mobile=18297806543");
?>

解决办法:字体乱码,设置字体

接下来看看是如何实现的点击查询功能的。

phone.php

<?php
    //字体乱码,设置字体
    header("Content-Type:application/json;charset=GBK");
    //得到用户输入的手机号
    $phone=$_GET["num"];
    //得到查询结果
    $result = file_get_contents("https://chongzhi.jd.com/json/order/search_searchPhone.action?mobile=".$phone);
    //输出查询结果
    echo $result;   
?>

展示给用户的页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>免费手机号归属地查询</title>
</head>
<body>
    <h3>免费手机号归属地查询</h3>
     <form action="">
        <p>
            <!-- 输入手机号 -->
            请输入你的手机号:<input type="text" id ="user_in"><br><br>
            <p id="reg"></p>
            <!-- 点击查询获得结果 -->
            <input type="button" value="点击查询" id="btn">
            <!-- 展示结果 -->
            <p class="result"></p>
            <!-- 引包 -->
            <script src="js/jquery-1.12.3.min.js"></script>
            <script>
                
                <!-- 点击查询 -->
                $("#btn").click(function(){
                    // 获取用户输入的值
                    var Phone_num = $("#user_in").val();
                    //正则检查输入的数据是否是手机好
                    if(!/^[0-9]{11}$/.test(Phone_num)){
                        //显示错误
                        $("#reg").html("错误的手机号!๑•ᴗ•๑");
                        return;
                    }       
                    console.log(Phone_num);
                    // Ajax发送请求
                    $.get("phone.php",{"num":Phone_num},function(data){
                        //移除错误
                        $("#reg").html("");
                        //得到json拼接结果后返回
                        $(".result").html(data.areaName+data.providerName)
                    });
                });
                
            </script>
        </p>
     </form>
</body>
</html>

文件已经上传到服务器上测试结果:https://www.52world.club/shoujihaoquery/

测试结果
总结:跨域请求一共两种方法
  • JSONP跨域,通过引包的方式实现。最好使用Ajax实现
    $.ajax({
        "dataType" : "jsonp",
        "url" : "www.163.com",    //jsonp的网址
        "jsonpCallback" : "haha",     //jsonp的网址是一句调用,所以这里要在window对象上注册一个函数,和jsonp那个调用同名。
        "success" : function(data){   //成功的回调函数
              console.log(data);
        }
    });
  • PHP跨域,通过Ajax请求PHP文件的方式来实现。

相关文章

  • JSONP 跨域 & 制作手机号归属地查询

    一、跨域 同源策略指域名,协议,端口相同。所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西。...

  • 手机号归属地查询 API 接口调用请求

    手机号归属地查询 API 接口在网上已经很多且大都封装成了 API 供别人调用。支持前台跨域请求,以GET方式提交...

  • 跨域 & JSONP

    同源策略 同源策略:浏览器出于安全性的考量而制定的策略,只允许与本域下的接口交互。> 不同源的客户端脚本在没有明确...

  • JSONP & 跨域

    同源策略(Same origin Policy) 解析浏览器出于安全考虑,只允许与同域下的接口进行资源交互。不同域...

  • 对jsonp 的理解认识

    什么是跨域?为什么要跨域呢?听说jsonp能. 为什么jsonp能跨域呢?什么时候使用jsonp?怎么使用json...

  • 浏览器跨域问题,教你手写实现jsonp跨域

    跨域概述为什么会有跨域跨域解决办法:1、jsonp;2、后台代理手写实现jsonp跨域(包括服务器端代码) 跨域问...

  • ajax跨域请求

    ajax跨域请求(jsonp) 利用JSONP解决AJAX跨域问题的原理与jQuery解决方案JSONP jQue...

  • cookie和跨域数据交互(jsonp)

    cookie: 跨域数据交互(jsonp) 谁能跨域:JSONP/iframe-window.name/h5-PO...

  • 复习jsonp和promise

    一.jsonp 1.jsonp是跨域访问api,ajax不能跨域 2.在vue中使用jsonp首先要安装jsonp...

  • 跨域

    本文介绍跨域的八种方法: JSONP只要说到跨域,就必须聊到 JSONP,JSONP全称为:JSON with P...

网友评论

    本文标题:JSONP 跨域 & 制作手机号归属地查询

    本文链接:https://www.haomeiwen.com/subject/ziisnqtx.html