06AJAX

AJAX

服务器

通俗的讲,能够提供某种服务的机器(计算机)称为服务器。

服务器类型

按照不同的划分标准,服务可划分为以下类型:
1、按服务类型可分为:文件服务器、数据库服务器、邮件服务器、Web 服务器等;
2、按操作系统可分为:Linux服务器、Windows服务器等;
3、按应用软件可分为 Apache服务器、Nginx 服务器、IIS服务器、Tomcat服务器、Node服务器等。

服务器软件

使计算机具备提供某种服务能力的应用软件,称为服务器软件,通过安装相应的服务软件,然后进行配置后就可以使计算具备了提供某种服务的能力。
常见的服务器软件有:
1、文件服务器:Server-U、FileZilla、VsFTP等;
2、数据库服务器:Oracle、MySQL、PostgreSQL、MSSQL等;
3、邮件服务器:Postfix、Sendmail等;
4、HTTP 服务器:Apache、Nginx、IIS、Tomcat、NodeJS等;

HTTP服务器

即网站服务器,主要提供文档(文本、图片、视频、音频)浏览服务,一般安装Apache、Nginx服务器软件。
HTTP服务器可以结合某一编程语言处理业务逻辑,由此进行的开发,通常称之为服务端开发。
常见的运行在服务端的编程语言包括 PHP、Jsp、Asp、Python、Ruby、Perl等。

客户端

具有向服务器索取服务能力的终端,如比如 手机、电脑等,通过安装不同的客户端软件,可以获取不同的服务,比如通过QQ获得即时通讯服务、通过迅雷获得下载服务等。
常见的客户端软件:浏览器、QQ、迅雷、Foxmail等。
以浏览器为宿主环境,结合 HTML、CSS、Javascript等技术,而进行的一系列开发,通常称之为前端开发。

网络基础

IP地址

所谓IP地址就是给每个连接在互联网上的主机分配的一个32位地址。(就像每部手机能正常通话需要一个号码一样)
查看本机IP地址 ping、ipconfig、ifconfig

域名

由于IP地址基于数字,不方便记忆,于是便用域名来代替IP地址,域名是一个IP地址的“面具”
查看域名对应的IP地址 ping、tracert

DNS服务

DNS记录了 IP 地址和域名的映射(对应)关系;
查找优先级 本机hosts文件、DNS服务器

端口

端口号是计算机与外界通讯交流的出口,每个端口对应不同的服务。
现实生活中,银行不同的窗口办理不同的业务。
查看端口占用情况 netstat -an
常见端口号 80、8080、3306、21、22

C/S和B/S

C/S结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

C/S(即Client、Server),在C/S结构的情况下,不同的服务需要安装不同的客户端软件,比如QQ、迅雷、Foxmail这种情况下安装的软件会越来越多,进而占用非常多的系统资源,除此之外还有其它弊端,比如A出差,需要在B电脑上查收邮件,但是B电脑并未安装Foxmail等类似的客户端软件,这样不得不先去下载Foxmail,非常不方便,并且客户端软件升级后也需要重新下载。

B/S结构

B/S(即Broswer、Server)解决了C/S所带来的不便,将所有的服务(如QQ、邮件等)都可以通过浏览器来完成,因为基本所有浏览器都安装了浏览器,这样可以更多的节省系统资源,并且功能升级也无需重新下载,只要刷新网页即可,要但B/S也有一些不利,比如操作稳定性、流畅度等方面相对较弱。

PHP基础

入门

内容输出
    echo:输出简单数据类型,如字符串、数值
    print_r():输出复杂数据类型,如数组
    var_dump():输出详细信息,如对象、数组(了解)

<?php
    // 设置编码格式
    header('content-type:text/html; charset=utf-8');
    //输出内容
    echo 'hello world';
    echo '你好,世界';
?>

变量

1、变量以$开头 字母/数字/下划线 不能以数字开头
2、大小写敏感(区分大小写)
3、数据类型:字符型、整型、浮点型、布尔型、数组、对象、NULL
    
<?php
    // 设置编码格式
    header('content-type:text/html; charset=utf-8');
    // 定义变量
    // 字符串
    $name = '张三';
    echo $name;
    // 输出换行
    echo '<br>';
    // 数字
    $num = 123;
    echo $num;
    // 小数
    $pi = 3.1415826;
    echo '<br>';
    echo $pi;
    // 布尔
    $male = false;
?>

运算符

基本与Javascript语法一致
. 号表示字符串拼接符,Javascript中为+echo '<br>' . $name . $name;

函数

与Javascript基本一致
函数名对大小写不敏感
默认参数(了解即可)

分支、循环语句

选择语句
    switch (表达式){
        case:
            执行结果;
            break;
        default:
            执行结果;
            break;
    }

if循环语句
    for ($i = 0; $i < 10; $i++){
        echo '<br>' . $i;
    }

while循环语句
    $j = 0;
    while($j < 100){
        echo '<br>' . $j;
        $j++;
    }

数组

定义数组
	$arr = array('榴莲','西兰花','鸡蛋');

获取数组元素 下标从0开始
     echo $arr[2];

直接输出复杂类型
    print_r($arr);

获取数组长度
    echo count($arr);

循环遍历
    for ($i=0; count($arr); $i++){
        echo '<br>';
        echo $arr[$i];
    }

关系型数组
    $person = array('name'=>'吴京', 'film'=>'战狼', 'wife'=>'谢楠');

获取内容
    echo $person['name'];

完整输出数组
    print_r($person);

遍历数组
    foreach ($person as $key => $value){
        echo $key.'-----'.$value.'<br>';
    }

二维数组
    $starArr = array(
        array('name'=>'吴京', 'film'=>'战狼'),
        array('name'=>'刘德华', 'film'=>'无间道'),
        array('name'=>'黄渤', 'film'=>'斗牛')
	);

获取内容
    echo $starArr[2]['film'];

循环遍历
    for($i=0; $i<count($starArr); $i++){
        echo $starArr[$i]['name']. '出演了'. $starArr[$i]['film']. '<br>';
    }

文件引入

include 'php文件'require 'php文件'

表单处理

<form action="" method="">
    <input type="" name="">
</form>
    action: 设置接收数据的处理程序
    method: 设置发送数据的方
    name: 用来提供给服务端接收所传递数据而设置的
    当上传文件是需要设置 enctype="multipart/form-data",且只能post方式
    
$_GET接收 get 传值
$_POST接收 post 传值
    
$_FILES接收文件上传
    Array (
        [icon] => Array (
            [name] => 1405937554667.png  上传的文件名
            [type] => image/png 类型
            [tmp_name] => C:\Users\51772\AppData\Local\Temp\php52F7.tmp 路径 临时
            [error] => 0 错误编码
            [size] => 13949  大小
        )
    )
	移动上传的文件
        move_uploaded_file(移动的文件,移动到哪里去)
        move_uploaded_file($_FILES['icon']['tmp_name'],'./files/'.$_FILES['icon']['name']);
    
get方式
    数据总是拼接在url中
    数据安全性不好
    数据长度问题
    测试方便

post方式
    必须设置method='post'
    提交的数据不在url中,安全性好
    post提交数据没有长度限制
    如果上传文件必须使用post

常用PHP函数

是否在数组中
	in_array() 
计算数组长度
	count() 
检测数组中是否存在key
	array_key_exists ()
读取文件
	file_get_contents

网络传输协议

网络传输协议:指服务器和客户端间进行通信时的约束和规范
客户端与服务端的数据交互并不是杂乱无章的,需要遵照(基于)一定的规范进行。

常见协议
    HTTP、HTTPS 超文本传输协议
    FTP 文件传输协议
    简单邮件传输协议

HTTP协议

即超文本传输协议,网站是基于HTTP协议的,例如网站的图片、CSS、JS等都是基于HTTP协议进行传输的。
HTTP协议是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行了约束和规范。
即HTTP协议主要由请求和响应构成。
常用请求方法 POST、GET、PUT、DELETE

请求/请求报文

请求由客户端发起,其规范格式为:请求行、请求头、请求主体。

请求行
	由请求方式、请求URL和协议版本构成
    Request URL: http://127.0.0.1/ajax/07update_file/
    Request Method: GET
    
请求头
	Host:localhost请求的主机
    Cache-Control:max-age=0控制缓存
    Accept:*/* 接受的文档MIME类型
    User-Agent:很重要
    Referer:从哪个URL跳转过来的
    Accept-Encoding:可接受的压缩格式

请求主体
	即传递给服务端的数据

post形式提交表单的时候,请求头里会设置,get形式当不需要
	Content-Type: application/x-www-form-urlencoded
	xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

响应/响应报文

响应由服务器发出,其规范格式为:状态行、响应头、响应主体。

状态行
	由协议版本号、状态码和状态信息构成
	Status Code: 200 OK

响应头
    Date:响应时间
    Server:服务器信息
    Content-Length:响应主体长度
    Content-Type:响应资源的MIME类型

响应主体
	即服务端返回给客户端的内容
	
MIME是标识文件类型的,文件后缀并不能正确无误的标识文件的类型。
客户端与服务器在进行数据传输的时候都是以字节形式进行的,咱们可以理解成是以“文本形式”传输
这时浏览器就需要明确知道该怎么样来解析这些文本形式的数据,MIME就是明确告知浏览器该如何来处理。

状态码

常见的有200代表成功、304文档未修改、403没有权限、404未找到、500服务器错误
状态码含义
100-199表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200-299表示成功接收请求并已完成整个处理过程
300-399为完成请求,客户需进一步细化请求
400-499客户端请求有错误
500-599服务器端出现错误

调试工具

利用HTTP抓包工具在开发中可以帮我们进行调试,常用抓包工具HttpWatch、Fiddler、Charles、FireBug等

浏览器插件
	Firebug、HttpWatch、chrome dev tools

代理软件
	Charles、Fiddler

AJAX编程

ajax
    即 Asynchronous Javascript And XMLAJAX 不是一门的新的语言,而是对现有持术的综合利用。
    本质是在HTTP协议的基础上以异步的方式与服务器进行通信。

异步
	xhr.open('请求方式', 'url');
    指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序不依赖程序本身的书写顺序
    其优势在于不阻塞程序的执行,从而提升整体执行效率。

同步
	xhr.open('请求方式', 'url'false);
	请求响应之前什么事都干不了   一件一件的干
    
XMLHttpRequest
    XMLHttpRequest可以以异步方式的处理程序。
    浏览器内建对象,用于在后台与服务器通信,由此我们便可实现对网页的部分更新,而不是刷新整个页面。

请求

创建异步对象
    var xhr = new XMLHttpRequest();

请求行
    xhr.open('请求方式', 'url');
    get请求 
		数据是拼接在 url中的
    	xhr.open('get','xxx.php?name=jack&skill=painting');
	post请求
		xhr.open('post', 'xxx.php');
	

注册回调函数
    请求响应回来了触发
    xhr.onload =function () {
        console.log(xhr.responseText);
    }

请求头
    参数1:键名  参数2:值
    get请求
		可以省略设置请求头的操作,也可以随意写
    	xhr.setRequestHeader('heima', 'day day up');
	post请求
		在不发送数据时也可以省略,发送数据不能省略
        固定格式
		xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

请求主体发送
	get请求
		xhr.send(null);
    post请求
		发送数据写在send中
        key1=value1&key2=value2...
        不要加空格,需要紧密挨着
        xhr.send('name=西兰花&friend=鸡蛋');

响应

HTTP响应是由服务端发出的,作为客户端更应关心的是响应的结果。
HTTP响应3个组成部分与XMLHttpRequest方法或属性的对应关系。
由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。

注册回调函数
    xhr.onload =function () {

    }
	在状态改变时触发  触发多次
    xhr.onreadystatechange = function(){

    }
状态变化
    xhr.readyState
    0时,UNSENT open尚未调用
    1时,OPENED open已调用
    2时,HEADERS_RECEIVED 接收到头信息
    3时,LOADING 接收到响应主体
    4时,DONE 响应完成

获取状态行
	获取状态码  如 200 404
    	xhr.status
	获取状态信息  如OK
    	xhr.statusText

获取响应头
	获取指定头信息
    	xhr.getResponseHeader('Content-Type');
	获取所有响应头信息
    	xhr.getAllResponseHeaders();

获取响应主体
	检测并判断响应头的MIME类型后确定使用responseText或者responseXML
    xhr.responseText;
	xhr.responseXML;

XML

XML是一种标记语言,很类似HTML,其宗旨是用来传输数据,具有自我描述性(固定的格式的数据)。
虽然可以描述和传输复杂数据,但是其解析过于复杂并且体积较大,所以实现开发已经很少使用了。

<?xml version="1.0" encoding="UTF-8" ?>
<!--xml只能使用双标签-->
<root>
    <name>张三</name>
    <age>18</age>
    <skill>唱歌</skill>
</root>

语法规则
    必须有一个根元素
    不可有空格、不可以数字或.开头、大小写敏感
    不可交叉嵌套
    属性双引号(浏览器自动修正成双引号了)
    特殊符号要使用实体
    注释和HTML一样

JSON

即 JavaScript Object Notation,另一种轻量级的文本数据交换格式,独立于语言。
JSON体积小、解析方便且高效,在实际开发成为首选。

语法规则
    数据在名称/值对中
    数据由逗号分隔(最后一个健/值对不能带逗号)
    花括号保存对象方括号保存数组
    使用双引号
    
JSON的载体为字符串''包裹
    
JSON语法 -- 用来表示对象
    对象使用{}
    属性名必须用""包裹
    属性值必须使用""包裹,如果属性值是数值可以不使用""
        var JSONObject = '{"name":"张三","skill":"失忆"}';
        console.log(JSONObject);
    转换为对应的对象(数组)
        var Obj = JSON.parse(JSONObject);
        console.log(Obj);
        console.log(Obj.name + ":" + Obj.skill);

JSON语法 -- 用来表示数组
    对象使用[]
    必须用""包裹
        var JSONArr = '["大蒜","大葱","番茄"]';
        console.log(JSONArr);
    转换为对应的对象(数组)
        var Arr = JSON.parse(JSONArr);
        console.log(Arr);
        console.log(Arr[2]);

JSON语法 -- 对象数组
    var JSONObjArr = '{"name":"李四","friends":["张三","王五","赵六"]}';
    console.log(JSONObjArr);
	转换为对应的对象(数组)
    var ObjArr = JSON.parse(JSONObjArr);
    console.log(ObjArr);
    console.log(ObjArr.name);
    console.log(ObjArr.friends[1]);

JSON解析
    JSON数据在不同语言进行传输时,类型为字符串
    不同的语言各自也都对应有解析方法,需要解析完成后才能读取
    Javascript解析方法
    	eavl()JSON对象 JSON.parse()JSON.stringify()JSON兼容处理json2.js
   	PHP解析方法
		json_encode()、json_decode()

封装

/**
 * 
 * @param option(键名 url type data success)
 */
function ajax(option) {
    var xhr = new XMLHttpRequest();
    if (option.type == 'get'){
        if (option.data){
            option.url += '?';
            option.url += option.data;
            option.data = null; //最后直接send
        }
    }
    xhr.open(option.type,option.url);
    if (option.type == 'post'){
        if (option.data){
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
        }
    }
    xhr.onreadystatechange =function () {
        if (xhr.readyState==4 && xhr.status==200){
            var type = xhr.getResponseHeader('Content-Type');
            // console.log(type);
            //indexOf是否含有该字符串,不含有返回-1
            if (type.indexOf('json')!= -1){
                option.success(xhr.responseText);
            }else if (type.indexOf('xml')!= -1){
                option.success(xhr.responseXML);
            }else {
                option.success(xhr.responseText);
            }
        }
    }
    xhr.send(option.data);
}

jQuery中的Ajax

jQuery为我们提供了更强大的Ajax封装
jQuery Ajax介绍
http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp

$.get()GET方式发起Ajax请求
$.post()POST方式发起Ajax请求
    $('').事件(function () {
        $.get/post(地址,发送数据可以为字符串也可以为json对象,回调函数
    })

    $('').click(function () {
        $.get/post('backSendData.php','name=rose&husband=robot',function (data) {
        	console.log(data);
        })
    })
    
    $('').click(function () {
        $.get/post('backSendData.php',{name:'rose',husband:'robot'},function (data) {
        	console.log(data);
        })
    })

$.ajax({}) 可配置方式发起Ajax请求
    $('.ajax').click(function () {
        $.ajax({
            url: 'backJSON.php',
            type: 'get',
            data: 'name=rose&husband=robot',
            success: function (data) {
                console.log(data);
            }
        })
    })

$('form').serialize() 序列化表单(即格式化key=val&key=val)
url 接口地址
type 请求方式 默认为get请求,如果是get可以不写
timeout 请求超时
dataType 服务器返回格式
data 发送请求数据  若没有请求可以不写
beforeSend 请求发起前调用
success 成功响应后调用
error 错误响应时调用
complete 响应完成时调用(包括成功和失败)

模板引擎

art-template
	https://aui.github.io/art-template/zh-cn/
	步骤
        导入模板引擎
        定义模板
        挖坑 起名字  一般是取决于 数据
        填坑 数据 服务器 ajax  回调函数
        使用

流行模板引擎
    Handlebars:https://handlebarsjs.com/guide/

同源&跨域

同源
	同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

跨域
    不同源则跨域
    
对比
    http://www.example.com/                   对比                   
    http://api.example.com/detail.html        不同源  域名不同       
    https//www.example.com/detail.html        不同源  协议不同       
    http://www.example.com:8080/detail.html   不同源  端口不同       
    http://api.example.com:8080/detail.html   不同源  域名、端口不同 
    https://api.example.com/detail.html       不同源  协议、域名不同 
    https://www.example.com:8080/detail.html  不同源  端口、协议不同 
    http://www.example.com/detail/index.html  同源    只是目录不同   

跨域方案
    1、顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)
    2、document.domain + iframe
    3、window.name + iframe
    4、location.hash + iframe
    5、window.postMessage()

参考资料
	http://rickgray.me/2015/09/03/solutions-to-cross-domain-in-browser.html

JSONP

原理剖析
	其本质是利用了<script src=""></script>标签具有可跨域的特性
	由服务端返回一个预先定义好的Javascript函数的调用
	并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。
	文件后缀并不能代表什么,关建我们要看服务器返回的内容,比如css.php

	返回的内容为 echo ‘body {background:color}’
	我们可以通过content-type:text/css来指定浏览器该如何解析,返回的内容

	同样我们也可以js文件以.php结尾,比如js.php 这时我们可以指定Content-Type: 				text/javascript可告知浏览器要以javascript来执行我们返回的内容
	如果返回的是一个javascript的一个函数调用
	那么在这个函数调用过程中可以将跨域请求来的数据以“实参”的传递过来
	并且这个实参一般是JSON格式的
	只能以GET方式请求
	
jQuery中的JSONP
    jQuery 的$.ajax() 方法当中集成了JSONP的实现,可以非常方便的实现跨域数据的访问。
    jsonp 可以指定服务端接收的参数的“key”值,默认为callback
    jsonpCallback 可以指定相应的回调函数,默认自动生成
    设置dataType值为jsonp即开启跨域访问   dataType: 'jsonp' 

XMLHttpRequest 2.0

技术总是在实践中不断更新的,XMLHttpRequest也不例外。

设置超时
    设置超时时间
    	xhr.timeout = 3000;
    监听超时事件
    	当请求超时,此事件就会被触发
    	xhr.ontimeout = function () {// code}

FormData
    提供了一个新的内建对象,可用于管理表单数据
    首先要获取一个表单元素form
    	var form = document.querySelector('#ajaxFrom');
    然后在实例化时 new FormData(form),将表单元素form传进去
    	var formData = new ForData(from);
    追加数据
    	formData.append(键,值);
    会返回一个对象,此对象可以直接做为xhr.send(formData)的参数
    此时我们的数据就是以二进制形式传递了
    注意我们这里只能以post形式传递,浏览器会自动为我们设置一个合适的请求头
    
二进制
    我们上传文件是以二进制形式传递的
    我们可以通过表单<input type="file">获取到一个文件对象
    然后file.files[0]可以获取文件信息
    然后再利用var formData = new FormData() 实例化
    然后再利用formData.append(‘upload’, file.files[0])将文件转成二进制
    最后将 formData 做为xhr.send(formData)的参数
    
上传进度
    利用XMLHttpRequest我们可以实现文件的上传
    并且我们可以通过xhr.upload.onprogress = function (ev) {// code},监听上传的进度
    这时我们上传的进度信息会保存在事件对象ev里
    ev.loaded 表示已上传的大小,ev.total表示文件整体的大小
    var percent = ev.loaded / ev.total

orm
var form = document.querySelector(‘#ajaxFrom’);
然后在实例化时 new FormData(form),将表单元素form传进去
var formData = new ForData(from);
追加数据
formData.append(键,值);
会返回一个对象,此对象可以直接做为xhr.send(formData)的参数
此时我们的数据就是以二进制形式传递了
注意我们这里只能以post形式传递,浏览器会自动为我们设置一个合适的请求头

二进制
我们上传文件是以二进制形式传递的
我们可以通过表单获取到一个文件对象
然后file.files[0]可以获取文件信息
然后再利用var formData = new FormData() 实例化
然后再利用formData.append(‘upload’, file.files[0])将文件转成二进制
最后将 formData 做为xhr.send(formData)的参数

上传进度
利用XMLHttpRequest我们可以实现文件的上传
并且我们可以通过xhr.upload.onprogress = function (ev) {// code},监听上传的进度
这时我们上传的进度信息会保存在事件对象ev里
ev.loaded 表示已上传的大小,ev.total表示文件整体的大小
var percent = ev.loaded / ev.total

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值