web项目引入json插件_为您的Web项目构建一个简单的JSON控制器

web项目引入json插件

您的下一个PHP / MySQL项目可能与您完成的最后十二个项目类似:设置MySQL数据库,创建包含HTMLPHP​​视图,根据需要添加JavaScript代码和CSS文件,连接到数据库,从数据库来填充您的视图,依此类推。 如果您熟悉Web开发,则知道分离功能代码的好处。 例如,您知道要避免直接在视图中输入原始SQL查询,并且不要在从数据库中提取数据的函数或类中混合HTML标记。

但是,在某些时候,您的项目可能会超出正常PHP / MySQL舒适度级别。 例如,您可能不仅具有需要数据库数据的普通Web视图,而且还具有访问相同数据的外部应用程序(如Facebook)甚至移动设备(也许是智能手机)。

您可能会发现自己处于数据库更改或需要处理某种平面文件XML存储库的情况。 在这种情况下,您对MySQL的盲目依赖可能会妨碍您完成项目。

考虑将RESTful JSON控制器放入您的项目中,并将其用作虚拟“交通警察”,以向您的数据源发送请求并接受来自数据源的响应。 本文介绍REST和JSON的基础知识,并向您展示一种设置控制器的方法。 结果是一种简便的方法,可以以标准化的格式从源中检索数据,您可以轻松地使用PHP或JavaScript代码进行解析。

什么是REST?

在典型的REST体系结构中,客户端向服务器发送请求,服务器以请求资源的表示形式进行响应。 资源几乎可以是任何信息对象,例如数据库或文档,并且其表示形式通常是格式化的文档(通常是XML或JSON),用作其当前或请求状态的快照。

REST资源通常使用有意义的URL进行标识,这些URL接受不同的请求“动词”(即GETPOSTPUTDELETE 。 这些动词在某种程度上类似于许多开发人员熟悉的create-retrieve-update-delete(CRUD)模型。

例如,如果要检索数据,请使用GET请求; 创建数据,一个POST请求; 更新数据,一个PUT请求; 最后,要删除数据,请执行DELETE请求。

要考虑的另一个重要因素是响应。 RESTful服务通常在响应中提供两个有意义的组件:响应主体本身和状态代码。 实际上,许多REST服务器都允许用户通过发送ACCEPT参数或指定文件扩展名(例如,/ api / users.xml或/)来指定响应格式(例如XML,CSV,序列化PHP或纯文本)。 api / users.json)。 其他REST服务器(如您将在此处实现的服务器)具有硬编码的响应格式。 只要有文件记录,这些都是同样可以接受的。

响应代码通常是HTTP状态代码。 该模式的优点在于,您可以使用现有的知名状态代码来识别错误或成功。 201状态码( CREATED )是对成功POST请求的完美响应。 错误代码500表示您端失败,但是错误代码400指示客户端端失败( BAD REQUEST )。 如果服务器出了点问题,请发送503( SERVICE UNAVAILABLE )。

请考虑以下示例:应用程序的数据源包含用户信息-名字,姓氏,电子邮件地址和Twitter帐户。 如果要设置典型PHP应用程序,则将创建mysql_query()包装器,以使用SQL查询从数据库中提取列表。 您还会有一些PHP代码,这些代码将调用该函数并遍历结果集以在应用程序视图中显示数据。

一种更简单的方法是设置一个简单的REST控制器,该控制器允许对/ users / list的GET请求而无需任何其他参数,然后依次调用适当的数据库函数并以JSON格式返回列表。 然后,您的应用程序可以解码该JSON数据并以显示内容所需的任何方式遍历它。

此外,您可以测试以查看是否有任何参数发送到/ users / list。 例如,如果您将GET请求发送到/ users / list / 1,则响应仅包含ID为1的用户的详细信息。 您甚至可以允许使用除JSON之外的其他格式,例如XML,CSV或序列化PHP。

RESTful JSON控制器可以为您的开发工作做更多的工作,而不是在视图和数据源之间添加额外的功能层。 请考虑,您的基本PHP视图可能不是请求信息的唯一内容。 例如,您可以使用jQuery通过Ajax界面请求信息,或者您的用户可以通过智能手机或Facebook应用程序请求信息。

在这些情况下,RESTful接口可以接受请求并以易于理解(和预测)的格式提供响应,可以大大简化您的开发工作。 作为负责PHP视图(甚至iPhone应用程序)的开发人员,您可以将请求发送到URL并接收一组预期的响应。 在JSON控制器的另一端,可以将应用程序连接到MySQL,PostgreSQL,XML文件存储库或根本不连接。

什么是JSON?

JSON是一种轻量级的基于文本的数据交换格式,人类和计算机都易于消化和使用。 最初,JSON旨在表示简单的数据结构。 尽管最初将它设计为特定地传输JavaScript友好数据的方法,但现在几乎每种计算机语言都可以使用解析器。 在PHP中,一对本地JSON函数可以帮助您完成很多繁重的工作( json_encodejson_decode )。 只需将数据数组(甚至是一个简单的字符串)发送到json_encode ,就会出现一个JSON对象(如清单1所示)。

清单1.一个PHP数组与一个JSON对象
$data = array(
	'firstname' => 'Tom', 
	'lastname' => 'Smith', 
	'age' => 40
);

print_r($data);
/* prints 
Array( 
	[firstname] => Tom
	[lastname] => Smith
	[age] => 40
)
*/

echo json_encode($data);

/* prints
	{ "firstname": "Tom",
	  "lastname": "Smith",
	  "age":40
	}	
*/

请注意,通过SQL查询生成的典型PHP数组(键与数据库字段名称匹配,而值与数据匹配)很容易作为JSON对象进行传输。 到达后,数据可以简单地是带有JavaScript代码的eval() (例如,从Ajax上下文中),或者可以用PHP中的json_decode()进行解码,以将其重新制成数据数组。

JSON数据除对象外还支持各种数据类型:字符串,空值,数字(整数或实数),布尔值和数组(用方括号括起来的逗号分隔的值序列)。 结果,JSON用户在处理数据时会获得很大的灵活性。

本文将帮助您构建一个极简的JSON REST控制器,您可以将其放置在模型和视图功能之间。 构建完成后,您可以定制自己的扩展以适合项目的目标。

构建一个基本的JSON控制器

想象一个提供事件信息的应用程序。 所有事件信息都是公开的,因此身份验证问题在这里不是主要问题。 此外,目标是允许查询有关今天发生的事件,并使用JSON将响应传输回请求发起方。 现在,假设请求者是一个PHP视图页面。

首先,为事件创建一个简单的数据库模式,如清单2所示。

清单2.数据库模式(MySQL)
CREATE TABLE  `events` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 255 ) NOT NULL ,
`address` VARCHAR( 255 ) NOT NULL ,
`start_time` DATETIME NOT NULL ,
`description` TEXT NOT NULL
);

数据库表正常运行后,输入一些模拟数据记录。 确保至少一天安排了多次输入。

接下来,创建一个典型PHP模型文件,该文件连接到该数据库并使用SQL查询标识事件。 如果这是一个真实的应用程序,则可能要将数据库连接脚本与其余的脚本分开,并在查询中进行各种数据验证。 您的代码可能类似于清单3

清单3.一个简单的查询
$SERVER = 'name';
$USER = 'username';
$PASS = 'pw';
$DATABASE = 'dbname';


if (!($mylink = mysql_connect( $SERVER, $USER, $PASS)))
{
	echo "Sorry, could not connect to DB. Contact your sysadmin for help!";
	exit;
}
mysql_select_db( $DATABASE );


class Events{

	function get_events($day){
		$ret_array = array();
		$sql = "select id,title,address,start_time,description 
				from events where start_time like '$day%'
				order by start_time asc";
		$result = mysql_query($sql);

		while($data = mysql_fetch_object($result)){
			$obj['id'] = $data->id;
			$obj['title'] = $data->title;
			$obj['address'] = $data->address;
			$obj['start_time'] = $data->start_time;
			$obj['description'] = $data->description;

			$ret_array[] = $obj;
		}	

		return $ret_array;
	}
}

当您使用一个已知的日期来设置对该函数的简单调用时,您将获取一些事件,您将得到清单4所示的结果。

清单4.运行查询的结果
$EVENT = new Events;
$today = '2010-06-17';
$events = $EVENT->get_events($today);

print_r($events);

/* results in
	Array
	(
		[0] => Array
			(
				[id] => 2
				[title] => Event #2
				[address] => 156 My Avenue, MyTown, USA 78727
				[start_time] => 2010-06-17 11:30:00
				[description] => Join us for lunch to hear 
					FABULOUS SPEAKER. 
			)

		[1] => Array
			(
				[id] => 1
				[title] => Event #1
				[address] => 123 My Street, Anytown USA 78727
				[start_time] => 2010-06-17 15:30:00
				[description] => A great event! Hope to see you there!
			)

	)
*/

如果通过json_encode()运行相同的代码,则会得到一个可移植的JSON对象(如清单5所示)。

清单5. JSON数据对象
[
{"id":"2",
"title":"Event #2",
"address":"156 My Avenue, MyTown, USA 78727",
"start_time":"2010-06-17 11:30:00",
"description":"Join us for lunch to hear FABULOUS SPEAKER. "
},
{"id":"1",
"title":"Event #1",
"address":"123 My Street, Anytown USA 78727",
"start_time":"2010-06-17 15:30:00",
"description":"A great event! Hope to see you there!"
}
]

您的目标是建立一个简单的控制器,该控制器将知道要运行的模型和函数,然后返回JSON对象作为在事务的远端可用的响应。 该控制器将非常简短,如清单6所示 。 将所有这些代码粘贴到名为json.php的文件中。

清单6.一个简单的控制器
class JSON{

	var $response = '';

	function JSON($model,$function,$params){
		$REQUEST = new $model;
		$data = $REQUEST->$function($params);
		$this->response = json_encode($data);
	}
}

为了使此代码正常工作,需要您要调用的模型,实例化JSON类,然后传入三个参数:模型的类名,要运行的函数以及该函数的参数。 然后,此类调用该函数并获取通过json_encode()运行的响应。

最后一步是创建包含JSON数据请求的文件。 这个特定的文件(您可以称为Listing.php )可以设置为接受三个GET变量(每个分别用于模型,函数和参数),然后将这些变量传递给JSON类(如清单7所示)。 。

清单7.请求代码
//this is the code that contains the model
require 'events.php'; 

//this is the JSON controller
require 'json.php';

//pass in your three GET parameters
$MODEL = $_GET['model'];
$FUNCTION = $_GET['function'];

//check to see if param is passed in
//if not, use today's date in this instance
if (isset($_GET['param'])){
	$PARAM = $_GET['param'];
}else{
	$PARAM = date("Y-m-d");
}				
//invoke 
$JSON = new JSON($MODEL,$FUNCTION,$PARAM);

//access the response variable
echo $JSON->response;

此时,您可以将该文件加载到浏览器中,并获得一个类似于清单5中的JSON对象。 您可以通过json_decode()发送回JSON对象,使用JavaScript代码对其进行处理,或将其保留json_decode()

整个过程的一个更好的方法是创建一个更紧密地模仿RESTful服务器的路径结构。 例如,您可以创建一个名为events / today的目录结构,其中包含一个名为index.php的文件。 通过将浏览器指向/ events / today,您可以基于清单8中的代码获取JSON feed,而无需传入任何GET变量。

清单8. /events/today/index.php中的代码
require '../../events.php';
require '../../json.php';


$MODEL = "Events";
$FUNCTION = "get_events";
$PARAM = date("Y-m-d");


//invoke 
$JSON = new JSON($MODEL,$FUNCTION,$PARAM);	
echo $JSON->response;

//prints out
[
{"id":"3",
"title":"Test Event 3",
"address":"111 Main Street, Austin TX 78727",
"start_time":"2010-06-10 15:15:00",
"description":"Testing 456."
}
]

结论

使用这种方法,可以简化视图和支持应用程序的某些数据提取要求。 开发人员不必记住底层数据库的所有详细信息,而可以轻松访问URL并收到他们寻求继续自己的工作的响应。


翻译自: https://www.ibm.com/developerworks/web/library/wa-jsoncontroller/index.html

web项目引入json插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值