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


how to create a php web service which accepts a string and perform database operations

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

下面的例子演示了一个简单的PHP api/webservice (server &clientside)

如果需要java客户端(我只是看到有人评论可能是这种情况),那么您需要找到一种方法来打乱响应,以便可以用java处理它。例如,如果您以javascript jQuery的形式与PHP通信。web服务的响应很可能包含一个javascript可以理解的json响应。我对java不熟悉。

让开始

你的问题描述你想要什么的方式有点奇怪。就我而言,web服务是运行在服务器上的应用程序,它可以处理基于传入请求(get/post/原始数据)的操作。这些操作可以是获取数据、修改数据或注册数据。这也可能意味着有一个数据库或一个基于文本的文件来保存数据或从中获取数据。

如果这是你的意思,那么是的…这是有可能的。假设服务器a包含您的数据模型和操作add, getdelete的列表。首先,您可能要考虑的是为您的服务提供某种安全性。一个基本的安全示例是使用webserver-key。我通常使用md5()随机生成的字符串。当然,这并不是您可以采取的最好的安全措施,因为每个知道密钥的人都可以使用它,但我将在稍后讨论这个问题。

除了访问web服务器的安全性之外,还要考虑您希望传输数据的方式。您可以选择使用cURL向您的服务发送post/get请求,但这将包含所有开放数据。另一种选择(稍微混乱一点)是在发送之前进行序列化。进一步,您可能希望对字符串进行base64_encode。这至少会创建一个不可读的数据参数,并将其传输到您的web服务器。在最好的情况下,您可以创建一个自定义密钥,该密钥在web服务和服务器上可用,这是与web服务的通信。这个键打乱你的序列化参数,可以用来打乱你的web应用的服务/用户端响应/参数。

现在我们知道有另一个服务器从我们的webservice请求数据,我们也可以在"webservice密钥"上添加另一层安全。对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'的联系人的响应。

对于请求该数据有几个选项。最基本的是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_解码,然后对结果进行反序列化:

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

后面跟着一些检查:$data['action']有效吗?-如果是:是否找到所需的参数(删除/获取的id,添加的名称)—如果是:执行字段检查(有效的名称,有效的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.
);

最后但并非最不重要的是,不要忘记取消序列化&base64_decode您的$result字符串在客户端。

这是我如何实现一个简单的webservice在不同的服务器上跨域共享数据的基本解释。当然,我愿意接受别人的各种改进和建议。

//add-on:

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

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

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

但是,在某些情况下,一个简单的文本响应'ok'就足够了。或者你可能想要构建你的webservice来理解HTTP头响应,如'200 OK'。