我正在尝试决定是否应该为我正在制作的一些面向Web的函数使用REST服务或SOAP服务。这个决定是基于我是否可以在实现中轻松使用REST服务。我更喜欢使用REST,尽管我不想花几天时间在PHP中编写对象模型。
这些服务是在.NET中开发的,但主要由PHP使用。
基本上它已经归结为一点:易于整合。在PHP中使用SOAP我可以使用NuSOAP库,它将生成对象模型。
然而,使用REST,我似乎找不到轻松生成该模型的方法,如果可行,我会使用REST服务,因为它们更容易记录和扩展,并且还具有JSON功能。
我可以从XML文件/模式生成PHP中的对象模型,然后我可以使用REST服务进行序列化吗?
答案 0 :(得分:6)
你甚至可能不必去班级路线。简单地使用simplexml摄取数据,然后将其遍历为对象。或者如果你有json,json_decode($data, TRUE)
会做同样的事情(括号中没有属性)。
$ch = curl_init("http://example.com/some/rest/endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$data = curl_exec($ch);
$obj = simplexml_load_string($data);
print $obj->some->data->you['need'];
如果您的XML类似于
,则会打印here
<_>
<some>
<data>
<you need="here" />
</data>
</some>
</_>
答案 1 :(得分:0)
我在让SOAP在不同语言之间工作时遇到了一些麻烦(PHP&lt;&gt; JAVA和PHP&lt;&gt; .NET)
如果您使用SOAP,可能需要查看WS-I (Web Services Interoperability)
答案 2 :(得分:0)
根据您描述的要求,您应该坚持使用SOAP世界。请记住,REST只是一种架构分布式接口的风格。它没有说明如何实现该接口的功能。当然不需要将模式映射到对象。
话虽如此,如果您查看WCF REST Starter工具包中的客户端工具,您会发现将XML粘贴为CLR类型的功能。这将在创建基于XML实例文档的可序列化类时做出最佳猜测。
此外,根据您的描述,ADO.NET数据服务将为您提供一种向PHP站点公开RESTful数据服务的快速方法。
...
这是给你的问题?如果.Net服务将由PHP站点使用,那么为什么要将.Net服务描述为“面向Web”。根据您的描述,这些服务听起来更像是您网站的私人实施细节。
答案 3 :(得分:0)
如果我是你,我会:
答案 4 :(得分:0)
休息背后的整个想法是你不要像使用SOAP一样使用hackish“对象模型”。问题是你试图使用系统错误:)
如果您想要对象模型,请使用SOAP。
如果您想要网络友好的API,请使用REST。
答案 5 :(得分:0)
为了便于集成,我将使用REST API。由于存在如此强烈的约定,因此对于之前使用过REST的任何人来说,集成应该相对简单。
答案 6 :(得分:0)
所以我认为这可能是我正在寻找的东西。但我想知道它是否有某种自动化系统
在http://devzone.zend.com/article/1713#Heading11
找到了它扩展类
虽然上面的例子都是 可以使用PHP 4和domxml 扩展(只有API有点 有点不同),扩展的能力 使用您自己的代码的DOM类是 PHP 5的新功能 可以编写更易读的代码。 这是整个例子, 重写以使用DomDocument 类:
class Articles extends DomDocument {
function __construct() {
//has to be called!
parent::__construct();
}
function addArticle($title) {
$item = $this->createElement("item");
$titlespace = $this->createElement("title");
$titletext = $this->createTextNode($title);
$titlespace->appendChild($titletext);
$item->appendChild($titlespace);
$this->documentElement->appendChild($item);
} } $dom = new Articles(); $dom->load("articles.xml");
$dom->addArticle("XML in PHP5"); print
$dom->save("newfile.xml");