Hessian 1.0.5-RC2 常見問題

公司因業務需求準備開放一些API接口讓代理商使用,週末抽了些時間瞭解了一下這方面的技術後,決定採用caucho.com的Hessian實現(hessian使用方便又高效)

測試環境

    Window XP
    JDK 1.6
    Resin3.1.9
    Spring2.0.8
    hessian-3.0.20.jar(這個版本要與spring的對應,不要一味的追求最新版,我因爲這個,不知是好還是壞的毛病吃了N多苦頭)
    HessianPHP-1.0.5-RC2
    Apache2.2
    PHP5.3.0


剛開始跑Java服務器端和客服端的測試都很順利,但是當使用php5.3做爲客戶端訪問Java時出現了好幾個問題
Php代碼

    include_once   '../dist/Hessian.php' ;  
    include_once   '../dist/HessianClient.php' ;  
      
    Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.QueryParams' ,  'QueryParams' );  
    Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.ListResult' ,  'ListResult' );  
    Hessian :: mapRemoteType('com.hisupplier.showroom.entity.Product' ,  'Product' );  
    Hessian :: mapRemoteType('com.hisupplier.commons.page.Page' ,  'Page' );  
      
    try {  
        $params  =  new  QueryParams(114);  
      
        $url  =  "http://guiyou.jiaming.com/webService" ;  
        $proxy  =  new  HessianClient( $url );  
        echo   "<br>" ;  
        print_r($proxy ->hello( $params ));  
        echo   "<br>" ;  
        print_r($proxy ->getProduct( $params ));   
        echo   "<br>" ;  
        print_r($proxy ->getList( $params ));  //要命的問題出在這裏   
    } catch (HttpError $ex ) {  
        ...  
    }  

Java代碼

    public   interface  ShowroomAPI {  
        String hello(QueryParams params);  
        ListResult<Product> getList(QueryParams params);  
        Product getProduct(QueryParams params);  
    }  


第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代碼

    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:   
    #0 E:/workspace/php-test/dist/HessianClient.php(215): HessianParser->parseReply()   
    #1 E:/workspace/php-test/dist/Filter.php(159): HessianProxy->executeCall('getList' , Array)   
    #2 E:/workspace/php-test/dist/Filter.php(73): ProxyFilter->execute(Object(HessianProxy), Object(FilterChain))   
    #3 E:/workspace/php-test/dist/Filter.php(191): FilterChain->doFilter(Object(HessianProxy))   
    #4 E:/workspace/php-test/dist/Filter.php(73): PHPErrorReportingFilter->execute(Object(HessianProxy), Object(FilterChain))   
    #5 E:/workspace/php-test/dist/HessianClient.php(182): FilterChain->doFilter(Object(HessianProxy))   
    #6 E:/workspace/php-test/dist/HessianClient5.php(94): HessianProxy->call('getList' , Array)   
    #7 [internal function ]: HessianClient->__call( 'getList' , Array)   
    #8 E:/workspace/php-test/tests/test.php(23): HessianClient->getList(Object(QueryParams))   
    #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";

 

第4個問題,由於BOM頭引起,在調用過程中包含的文件有BOM,BOM在調用中先輸出,引起Hessian失敗,對於是UTF8編輯的文件,仔細檢查包含文件中是否有BOM頭的文件。下面有一段去BOM頭的PHP代碼,把這段代碼保存在WEB文件目錄下。直接執行可以查看是否有BOM頭的文件,把$auto = 1; 則會自動刪除BOM頭。


 

 

 

目前最新版本是HessianPHP_v2.0.3, 如果PHP版本是5.3以上最好選擇HessianPHP_v2.0.3版本。

下載地址:http://nchc.dl.sourceforge.net/project/hessianphp/HessianPHP/HessianPHP%202/HessianPHP_v2.0.3.zip

使用教程:http://hessianphp.sourceforge.net/index.php?n=Main.QuickStart

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章