码迷,mamicode.com
首页 > Web开发 > 详细

PHP下处理HTTP--json--xml信息

时间:2015-07-03 20:26:12      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

最近在开发微信公众号,也算对抓包,HTML,XML,JSON等概念有些了解。

在此总结一下,方便大家交流。

 

首先有个直观认识:

开发中xml与json,http协议与 socket技术分别有什么区别?

1)XML 和JSON是两种完全不同的数据表达方式。他们分别采用完全不同格式将原始数据转换成XML或者JOSN格式数据;然后再将XML或JOAN格式的数据还原为原始数据
2)Socket是用来编写TCP/IP或UDP/IP通信程序的;HTTP是使用TCP/IP的“应用层协议”,HTTP协议利用(借助于) TCP/IP 实现传输。
3)XML和JSON都可以借助HTTP进行传输
===
一个形象的比喻:TCP/IP是由SOCKET修建公路,HTTP是公路上跑的车,XML或JSON是车装载的货物。

 

在本文中,依次介绍

1、HTTP报文

2、file_get_contents

3、JSON

4、XML

5、XML 和 JSON的对比
6、如何在PHP中使用XML和JSON数据包

它们之间的逻辑关系如下

 技术分享

 

 

1、HTTP报文

HTTP 报文是在HTTP 应用程序之间发送的数据块。

这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。

这些报文在客户端、服务器和代理之间流动。

技术分享

 

  • 起始行

  报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

  • 首部字段

  起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

  • 主体

  空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

 

理论这么多,对于初学者而言,有些复杂。万幸的是,PHP为大家提供了接口函数。

 

2、file_get_contents

file_get_contents() 函数把整个文件读入一个字符串中。

和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

语法

file_get_contents(path,include_path,context,start,max_length)
参数描述
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context

可选。规定文件句柄的环境。

context 是一套可以修改流的行为的选项。若使用 null,则忽略。

start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。

 

举个栗子

从网址 http://www.weather.com.cn/adat/cityinfo/101010100.html 可以获取北京市的天气信息。

直接

                        $geoUrl = "http://www.weather.com.cn/adat/cityinfo/101010100.html";
                        $apiStr = file_get_contents($geoUrl);

即可以获取到数据包。

 

3、JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

 

比如,在第二节中,由http://www.weather.com.cn/adat/cityinfo/101010100.html 可以获取北京市的天气信息,就是使用JSON格式的数据。

技术分享

{
    "weatherinfo": {
        "city": "北京",
        "cityid": "101010100",
        "temp1": "15℃",
        "temp2": "5℃",
        "weather": "多云",
        "img1": "d1.gif",
        "img2": "n1.gif",
        "ptime": "08:00"
    }
}

可以使用这个在线工具校验一下JSON格式

http://www.bejson.com/

(以下JSON语言的内容来源于http://baike.baidu.com/link?url=XM52jJzz-iMxDn88YvHIhY72QZxyxNAyfXSTbARgOMkkDCqq_3dbc8A1CdTlzFXNOJ8E-M46IGzi-wYEAwsJkK)

JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。
  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

 

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。
名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
"firstName":"John"

 

这很容易理解,等价于这条 JavaScript 语句:
firstName="John"

JSON 值

JSON 值可以是:
  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null
JSON的两种结构
 
json简单说就是javascript中的对象数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}

 

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
{
    "people":[
        {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
        {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
        {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
    ]
}

在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):

经过对象、数组2种结构就可以组合成复杂的数据结构了。
{
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Jason",
        "lastName": "Hunter",
        "email": "bbbb"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Tad",
        "lastName": "Williams",
        "genre": "fantasy"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
}

 

 

4、XML

可扩展标记语言

来个直观认识,输入经纬度,从百度地图的api获取信息,

技术分享

 

这个就是使用XML语言进行表示信息。

 

OK ,看下语法部分。

(摘自http://www.ibm.com/developerworks/cn/xml/x-newxml/)

构建 XML

XML 文件由内容和标记组成。

通过以标记包围内容的方式将大部分内容包含在元素中。

例如,假设需要创建一本 XML 烹饪书。您需要用 XML 编写名为 Ice Cream Sundae 的食谱。为了标记食谱名,您需要将这个文本包含到元素中,即分别在文本的首末两端添加开始和结束标记。可以将元素命名为 recipename。要标记元素的开始标记,像这样将元素名放到尖括号中(<>):<recipename>。然后输入文本Ice Cream Sundae。在文本的后面输入结束标记,即将元素名放在尖括号内,然后在元素名前面加上一个终止斜杠(/),比如:</recipename>。这些标记构成一个元素,您可以在元素的内部添加内容或其他元素。

即,

<recipename>Ice Cream Sundae </recipename>

开始创建 XML 文件

XML 文档的第一行可以是一个 XML 声明。这是文件的可选部分,它将文件识别为 XML 文件,有助于工具和人类识别 XML(不会误认为是 SGML 或其他标记)。可以将这个声明简单地写成 <?xml?>,或包含 XML 版本(<?xml version="1.0"?>),甚至包含字符编码,比如针对 Unicode 的 <?xml version="1.0" encoding="utf-8"?>。因为这个声明必须出现在文件的开头,所以如果打算将多个小的 XML 文件合并为一个大 XML 文件,则可以忽略这个可选信息。

创建根元素

根元素的开始和结束标记用于包围 XML 文档的内容。一个文件只能有一个根元素,并且需要使用 “包装器” 包含它。清单 1 显示了经过删节的示例,其中的根元素名为 <recipe>

清单 1. 根元素
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
</recipe>

 

 

5、XML 和 JSON的对比

引自http://baike.baidu.com/link?url=XM52jJzz-iMxDn88YvHIhY72QZxyxNAyfXSTbARgOMkkDCqq_3dbc8A1CdTlzFXNOJ8E-M46IGzi-wYEAwsJkK

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8"?>
<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
            <city>哈尔滨</city>
            <city>大庆</city>
        </cities>
    </province>
    <province>
        <name>广东</name>
        <cities>
            <city>广州</city>
            <city>深圳</city>
            <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台湾</name>
        <cities>
            <city>台北</city>
            <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
            <city>乌鲁木齐</city>
        </cities>
    </province>
</country>

用JSON表示如下:

{
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": {
            "city": ["哈尔滨", "大庆"]
        }
    }, {
        "name": "广东",
        "cities": {
            "city": ["广州", "深圳", "珠海"]
        }
    }, {
        "name": "台湾",
        "cities": {
            "city": ["台北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
}
编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name(在JavaScript语法中这么使用)就能够读取“黑龙江”这个值。
编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。
 
 
6、如何在PHP中使用XML和JSON数据包
 
废话不说,直接上代码
 
 
对于XML的使用
Step1:使用函数file_get_contents()获取信息
Step2:使用函数simplexml_load_string()将数据转换为数组
Step3:使用就可以了
技术分享
$geoUrl = "http://api.map.baidu.com/telematics/v2/distance?waypoints=118.7959830000,31.9441250000;{$longitude},{$latitude}&ak=您的百度API的API Key";
$apiStr = file_get_contents($geoUrl);
$apiObj = simplexml_load_string($apiStr);//xml解析
$distanceObj = $apiObj->results->distance;

技术分享

 

 

对于JSON的使用

Step1:使用函数file_get_contents()获取信息
Step2:使用函数json_decode()将数据转换为数组
Step3:使用就可以了

$tranUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=您的百度API的API Key&q=您好&from=auto&to=auto" ; 
$tranStr = file_get_contents($tranUrl);
$tranSon = json_decode($tranStr);
$contentStr = $tranSon->trans_result[0]->dst;

技术分享

 

PHP下处理HTTP--json--xml信息

标签:

原文地址:http://www.cnblogs.com/wuqi/p/4618864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!