php该如何开发webservice

封心 发布于 2015/10/14 19:57
阅读 1K+
收藏 0
PHP

最近我们公司的平台要跟别家平台做数据交互,对方使用的是java开发的webservice,因为是有数据上的交互,所以双方都要做服务端,我们的平台是php开发的,所以就想着用php来开发webservice,虽然知道php有soap对应的类,但是没实际的开发经验,不知道该怎么下手,希望有这方面经验的给指导指导

下面是我想到的疑问:

1、是不是不管服务端还是客户端,输出的内容都要是xml格式的?有没有什么要求?

2、接口的安全性怎么做?我看到说是用什么用户身份验证,可是php的soap怎么来做用户身份验证?

加载中
1
南湖船老大
南湖船老大

    PHP做webservice服务器端给其他语言不建议,文档太少案例也少,其他语言可能难于调用。PHP适合做成简单的HTTP调用这种。而且一般PHP也很少做webservice的服务端,有的话也是PHP做服务端,PHP做客户端这种相同语言搭配。

Java调PHP的webservice倒也简单,Java内置webservice客户端API的,只需要一个WS地址,就可以生成一个service对象,然后调用service对象的getName方法。也可以用axis2,cxf (不推荐略复杂),但前提是这个WS是规范的。

封心
封心
回复 @南湖船老大 : 是对方公司的接口用webservice,现成的,改不了,我知道php有soap的服务端方案,现在就是没见过实际的案例,就像你说的,我也怕有坑
南湖船老大
南湖船老大
回复 @封心 : 如果Java那边方案你能自己决定,那就不用webservice,而用HTTP,双方都方便。没办法的话,PHP的soap也是有服务器端方法的啊,试一试就出来了,可能会有坑,但也不会很难
封心
封心
是啊,我也知道php不适合干这个事,但是没其他方面的资源,南老大给点建议呗
0
人与码
直接搜一下soap用法就行。 需要注意的是java调用php简单,php调用java需要写wsdl,而且要避免使用弱类型,数组或对象必须有一个固定结构,不能像php那么随意
0
封心
封心

引用来自“人与码”的评论

直接搜一下soap用法就行。 需要注意的是java调用php简单,php调用java需要写wsdl,而且要避免使用弱类型,数组或对象必须有一个固定结构,不能像php那么随意

php调用java的webservice我之前做过,接口是把 xml格式的数据作为数组的一个字符串参数传递过去,返回的也是xml格式的结果

如:

$string = '<?xml version="1.0" encoding="UTF-8"?><data>....</data>';
$client = new \SoapClient('http://xxx/service?wsdl');
$res = (array) $client->Method(array('in0' => $string));

但是不知道java是如何调用php的webservice的

如我写的接口:

Class PersonInfo
{
    /**
     *    返回姓名
     *    @return string 
     *
     */
    public function getName(){
        return "My Name is Chance";
    }
}



客户端用getName方法返回的是一个字符串,是不是这样就可以了?还是说将字符串写成xml格式的字符串?如果是数组怎么办?

南湖船老大
南湖船老大
Java客户端只需要一个WS地址,就可以生成一个service对象,然后调用service对象的getName方法
0
朱__朱
朱__朱

只要安装了soap扩展,对方给你提供了wsdl文件, 就可以用了,总共没有几个方法,试一试就明白了。

至于你们给它们提供的webservice完全没必要soap, 直接用jsonRPC就可以了,更简单用restfull设计一些固定的接口url给他们

0
人与码
php提供webservice给java只要是复杂数据类型就很麻烦,如果实在没有办法使用其他技术,那只好自己写了,你需要去看wsdl文档,自己构建一个wsdl文件暴露给java。
0
石头2012
石头2012

php是使用soap扩展来提供webservice服务的。这里给你提供个例子:

//server端 serverSoap.php

$soap = new SoapServer(null,array('uri'=>"http://10.8.8.21/"));//This uri is your SERVER ip.
$soap->addFunction('minus_func');                                                 //Register the function
$soap->addFunction(SOAP_FUNCTIONS_ALL);
$soap->handle();

function minus_func($i, $j){
    $res = $i - $j;
    return $res;
}

//client端 clientSoap.php
try {
    $client = new SoapClient(null,
        array('location' =>"http://10.8.8.21/test/serverSoap.php",'uri' => "http://127.0.0.1/")
    );
    echo $client->minus_func(100,99);

} catch (SoapFault $fault){
    echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring;
}

这是客户端调用服务器端函数的例子,我们再搞个class的。

//server端 serverSoap.php
$classExample = array();

$soap = new SoapServer(null,array('uri'=>"http://192.168.1.179/",'classExample'=>$classExample));
$soap->setClass('chesterClass');
$soap->handle();

class chesterClass {
    public $name = 'Chester';

    function getName() {
        return $this->name;
    }
}

//client端 clientSoap.php

try {
    $client = new SoapClient(null,
        array('location' =>"http://192.168.1.179/test/serverSoap.php",'uri' => "http://127.0.0.1/")
    );
    echo $client->getName();

} catch (SoapFault $fault){
    echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring;
}



你可以去测试一下!

封心
封心
这个我测试过类似的,我想知道的是 比如现在getName返回的是一个字符串,那么当java在调用这个方法的时候获取到的数据是一个xml格式的数据呢还是就是一个字符串?
0
封心
封心

感谢以上各位的热心回复,这两天才拿到对方的接口文档

什么狗屁webservice啊,当初还跟我说是java的webservice呢,搞得我头大了几天,结果就是个一般的http接口,post delete请求,传送和接收json数据


此用户已关机
此用户已关机
哈哈,对方的webservice非你理解的webservice 看来,那边只是把这种提供httpAPI的都称为webservice
返回顶部
顶部