如何创建一个接受字符串并执行数据库操作的php Web服务

时间:2013-03-27 09:58:22

标签: php web-services

我正在尝试创建一个 php web服务。我是PHP的新手。我有一个Java应用程序,它有2个字符串变量。这需要存储在Server数据库中以访问从服务器运行的php应用程序。所以我需要把它放在服务器上。所以我需要创建一个Web服务。是否可以将数据发送到Web服务?是否可以使用Web服务将数据写入数据库?

1 个答案:

答案 0 :(得分:5)

以下示例说明了PHP中的简单api / webservice(服务器和客户端)

如果需要一个java客户端(我只是看到有人评论它可能就是这种情况),那么你需要找到一种方法来以一种你可以用java处理它的方式来加扰响应。例如,如果您以javascript jQuery的形式与PHP通信。 web服务的响应可能包含一个json响应,可以通过javascript进行搜索。我不熟悉java ..

让我们开始

你的问题在描述你想要的东西时有点奇怪。就我而言, Web服务是在服务器上运行的应用程序,它可以根据传入的请求(获取/发布/原始数据)处理操作。这些操作可以获取数据,修改数据或者注册数据。这也意味着涉及数据库或基于文本的文件来保存数据/从中获取数据。

如果这就是你的意思,那么是的......这是可能的。假设服务器包含您的数据模型以及操作列表addgetdelete。您可能想要考虑的第一件事是为您的服务提供某种安全性。一个基本的安全示例是使用webserver-key。我通常使用随机的md5()生成的字符串。当然,这不是你可以采取的最好的安全措施,因为每个知道密钥的人都可以使用它,但我稍后会再回过头来看。

除了访问您的网络服务器的安全性之外,还要考虑您希望发送数据的方式。您可以选择使用cURL向服务发送发布/获取请求,但这将包含所有打开的数据。另一个选项(稍微加扰一点)是在发送它之前进行序列化..更进一步你可能想要对你的字符串进行base64_encode。这至少会创建一个不可读的数据参数,并将其传输到您的网络服务器。在最好的情况下,您创建一个自定义密钥,该密钥可在webservice和de服务器上获得,该服务器与Web服务进行通信。此密钥对您的序列化参数进行加密,可用于在Web应用程序的服务/用户端解扰响应/参数。

现在我们知道有另一台服务器从我们的webservice请求数据,我们还可以在“webservice key”中添加另一层安全性。对您的Web服务的每个请求都会发送一些参数(如$_SERVER['REMOTE_ADDR']),这些参数可用于将密钥与服务器IP或域主机配对。这会限制可能访问您服务的用户数量。

现在,一个非常基本的例子怎么样?

首先是webservice。您可以使用OO方式根据参数处理传入请求,但您也可以使用纯PHP文件:

http://www.webservice.com/api-contacts.php

  • 必需参数:操作
  • 可选参数:id&名称

使用$ _GET ['action'] ='get'和$ _GET ['id'] ='2'向api.php发送请求很可能会返回包含ID为'2'的联系人的响应。< / p>

要请求此数据,有几个选项。最基本的是file_get_contents或cURL。我认为cURL会更好,因为您可以更改更多选项以获得您想要的内容。

考虑到这是您在客户端的脚本:

$param = array();
$param['action'] = 'get';
$param['id'] = 2;
$params = base64_encode(serialize($param)); // generates a scrambled string

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.webservice.com/api-contacts.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLTOP_POSTFIELDS, 'data='.$params);
$result = curl_exec($ch);
curl_close($ch);

当然,api-contacts.php将首先对$ _POST ['data']字符串进行base64_decoding,然后对结果进行反序列化:

$data = unserialize(base64_decode($_POST['data']));

然后进行一些检查: - $ data ['action']有效吗? - 如果是:是找到所需的参数(id为delete / get,name为add) - 如果是:执行字段检查(有效名称,有效ID) - 如果是:插入,删除或获取结果 - 如果是:返回回复

响应也是一个数组,例如

$response = array(
  'result' => 'success',
  'data' => mysql_fetch_assoc($getUser) // obviously this is just to illustrate there's userdata in the 'api-contacts.php?action=get&id=2' request.
);

最后但并非最不重要的是,不要忘记反序列化&amp; base64_decode客户端的$result字符串。

这是我如何实现简单的Web服务以在不同服务器上的域之间共享数据的基本解释。当然,我愿意接受其他人的各种改进和提示。

//小插件:

我对响应进行序列化和base64编码的原因是因为数组不能作为文本响应发送,序列化字符串也可能在客户端收到时导致问题。

序列化&amp; base64编码的参数不是必需的,它只是通过http协议传输数据时的一点点额外的安全性。只使用CURL_OPTPOSTFIELDS作为'?action = get&amp; id = 2'就可以了!或者您可能希望该服务使用友好的网址并创建网址www.webservice.com/api-contacts/get/2,例如。

作为响应类型,有一些常见的事情: 1)XML响应 2)JSON响应 3)base64_encoded序列化数组

但是,在某些情况下,简单的文本响应“ok”就足够了。或者您可能希望构建您的Web服务以理解HTTP标头响应,例如'200 OK'。