hessian php与Java通信

公司因业务需求准备开放一些API接口让代理商使用,周末抽了些时间了解了一下这方面的技术后,决定采用caucho.com的Hessian实现(hessian使用方便又高效) 

测试环境 
  • Window XP
  • hessian-3.0.7.jar(这个版本要与spring的对应,不要一味的追求最新版,我因为这个,不知是好还是坏的毛病吃了N多苦头)
  • HessianPHP-2.0.3
  • Apache2.2
  • PHP5.3.0

刚开始跑Java服务器端和客服端的测试都很顺利,但是当使用php5.3做为客户端访问Java时出现了好几个问题 
Php代码 HessianPHP-1.0.5  收藏代码
  1. include_once '../dist/Hessian.php';  
  2. include_once '../dist/HessianClient.php';  
  3.   
  4. Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.QueryParams''QueryParams');  
  5. Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.ListResult''ListResult');  
  6. Hessian :: mapRemoteType('com.hisupplier.showroom.entity.Product''Product');  
  7. Hessian :: mapRemoteType('com.hisupplier.commons.page.Page''Page');  
  8.   
  9. try {  
  10.     $params = new QueryParams(114);  
  11.   
  12.     $url = "http://guiyou.jiaming.com/webService";  
  13.     $proxy = new HessianClient($url);  
  14.     echo "<br>";  
  15.     print_r($proxy->hello($params));  
  16.     echo "<br>";  
  17.     print_r($proxy->getProduct($params));   
  18.     echo "<br>";  
  19.     print_r($proxy->getList($params)); //要命的问题出在这里  
  20. } catch (HttpError $ex) {  
  21.     ...  
  22. }  


Php代码 HessianPHP-2.0.5  收藏代码

  1. require_once 'HessianPHP_v2.0.3/src/HessianClient.php';
    require_once 'HessianPHP_v2.0.3/src/HessianOptions.php'; 
    require_once 'HessianPHP_v2.0.3/src/HessianTypeMap.php'; 

    $testurl = 'http://127.0.0.1/Service/hessian/userInfoService';
    $handler = new HessianTypeMap();
    $handler->mapType('User', 'com.ub.common.sys.entity.User'); 
    $proxy = new HessianClient($testurl);    
    $user2=$proxy->getUserByUserId('01');
    print_r($user2);
    echo $user2->userId;
    echo $user2->getUserId();

Java代码   收藏代码
  1. public interface ShowroomAPI {  
  2.     String hello(QueryParams params);  
  3.     ListResult<Product> getList(QueryParams params);  
  4.     Product getProduct(QueryParams params);  
  5. }  

第1个问题  
因为php5.2.x版本后自带了DateTime类,和 HessianPHP 中的发生冲突 
解决: 改文件DateTime.php 为 HessianDateTime.php,类DateTime 为 HessianDateTime 

第2个问题  
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in G:\\php\\HessianPHP\\dist\\Hessian.php on line 74 
解决: 将date() 方法都改为 date_default_timezone_set() 

第3个问题  
Php代码   收藏代码
  1. Exception: Hessian Parser, Malformed reply: expected r Code: 2 exception 'HessianError' with message 'Hessian Parser, Malformed reply: expected r' in E:\workspace\php-test\dist\Protocol.php:339 Stack trace:   
  2. #0 E:\workspace\php-test\dist\HessianClient.php(215): HessianParser->parseReply()   
  3. #1 E:\workspace\php-test\dist\Filter.php(159): HessianProxy->executeCall('getList', Array)   
  4. #2 E:\workspace\php-test\dist\Filter.php(73): ProxyFilter->execute(Object(HessianProxy), Object(FilterChain))   
  5. #3 E:\workspace\php-test\dist\Filter.php(191): FilterChain->doFilter(Object(HessianProxy))   
  6. #4 E:\workspace\php-test\dist\Filter.php(73): PHPErrorReportingFilter->execute(Object(HessianProxy), Object(FilterChain))   
  7. #5 E:\workspace\php-test\dist\HessianClient.php(182): FilterChain->doFilter(Object(HessianProxy))   
  8. #6 E:\workspace\php-test\dist\HessianClient5.php(94): HessianProxy->call('getList', Array)   
  9. #7 [internal function]: HessianClient->__call('getList', Array)   
  10. #8 E:\workspace\php-test\tests\test.php(23): HessianClient->getList(Object(QueryParams))   
  11. #9 {main}  

google, baidu了半天也没找到相关的文章,后来把apache和php分别降到2.0和5.1还是不行,最后快放弃了试了一下yahoo,哦!my god佛祖保佑阿门,让我找了一了篇文章
引用

Chunked http responses cause a protocol parse error 

Http.php is written to perform an HTTP POST using HTTP/1.1 which means that 
the Hessian client must support a HTTP header of "Transfer-Encoding: 
chunked". 

Protocol::parseReply() is written as follows: 

if($this->read(1) != 'r') { 
return new HessianError('Hessian Parser, Malformed reply: expected 
r',HESSIAN_PARSER_ERROR,0,$this->stream); 


which will fail because the first line of a chunked response will contain 
the chunk length. Protocol::parseReply() needs to be written to support 
chunking. 

At the moment the workaround I have is to set HTTP/1.0 in Http::POST.

解决: 把Http.php中的1.1改为1.0 
在Http.php第200行: $out = "POST $this->url HTTP/1.1\r\n"; 

原来是因为http/1.1中Transfer-Encoding:chunked编码的包是分段发送的,我最后一个方法$proxy->getList($params) Java服务器端返回的数据量太大了,php这里没接收完整引起的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值