4

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

4

1 回答 1

5

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

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

开始吧

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

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

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

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

现在,一个非常基本的例子会是什么样子?

首先,网络服务。您可以使用基于参数的 OO 方式处理传入请求,但您也可以使用纯 PHP 文件:

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

  • 必需参数:动作
  • 可选参数:id & name

使用 $_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_decoding,然后对结果进行反序列化:

$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.
);

最后但同样重要的是,不要忘记$result在客户端对您的字符串进行反序列化和 base64_decode。

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

// 小插件:

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

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

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

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

于 2013-03-27T10:20:07.120 回答