Java 調用PHP的Web Service(三)

來源:互聯網
上載者:User

標籤:error   php   font   generate   pos   注意   wsdl   而且   return   

usoap是PHP環境中的開源soap工具,算是用得比較多的一個工具了。

    在utf-8環境中,nusoap可以工作得很好。但是當用於中文環境中時,nusoap經常會出現一些讓人不得其解的問題。

    最近一個項目中,服務端是用nusoap實現的,支援UTF-8和GBK兩種字元集。

    當用戶端用GBK來調用服務時,出現錯誤:Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK,意思是說,用戶端的請求中,HTTP Content-Type的字元集是US-ASCII,而soap請求的XML聲明裡,字元集是GBK,兩者不匹配。檢查soap client的request變數,HTTP Content-Type的值也是GBK,怎麼會變成了US-ASCII呢?有點莫名其妙了。於是只好跟蹤nusoap的源碼,發現nusoap在處理HTTP Content-Type時把US-ASCII,ISO-8859-1,UTF-8以外的字元集都預設為US-ASCII。最終發現其原因是因為nusoap使用了xml parser,而xml parser只支援這幾種字元集。所以用戶端在調用時,當採用GBK編時,調用的HTTP Content-Type 和 soap request的字元集都應該換成ISO-8859-1。

    稍後在封裝用戶端時,也遇到一個類似的問題。用戶端字元集聲明為GBK,服務端在返回SOAP調用結果時 HTTP Content-Type和soap request都聲明字元集為GBK,用戶端沒有擷取任何值。查看soap client的response對象,探索服務端返回正確。為解決這個問題,只好修改服務端,把HTTP Content-Type和soap response的字元集都聲明為ISO-8859-1。

    所以在使用nusoap時,當遇到GBK或GB2312字元集時,可以使用ISO-8859-1代替。

=============================================================================================

 

PHP Web Service Server端:

 

  1. <?php  
  2. //header("Content-Type:text/html;charset=UTF-8");  
  3.   
  4. // Pull in the NuSOAP code  
  5. require_once(‘./lib/nusoap.php‘);  
  6.   
  7. // Define the method as a PHP function  
  8. function hello($name) {  
  9.     return ‘你好! ‘ . $name;  
  10. }  
  11.   
  12. // Create the server instance  
  13. $server = new soap_server;  
  14.   
  15. $server->configureWSDL(‘hellowsdl‘, ‘urn:hellowsdl‘);  
  16. $server->wsdl->schemaTargetNamespace = ‘urn:hellowsdl‘;  
  17.   
  18. // Register the method to expose  
  19. $server->register(‘hello‘,  
  20. array(‘name‘=>‘xsd:string‘),  
  21. array(‘return‘=>‘xsd:string‘),  
  22. ‘urn:hellowsdl‘,  
  23. ‘urn:hellowsdl#hello‘,  
  24. ‘rpc‘,  
  25. ‘encoded‘,  
  26. ‘Say hello to somebody‘  
  27. );  
  28.   
  29. // Use the request to (try to) invoke the service  
  30. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ‘‘;  
  31. $server->service($HTTP_RAW_POST_DATA);  
  32. ?>  

 

 

   Client 端:

 

  1. <?php  
  2. //header("Content-Type:text/html;charset=GB2312");  
  3. // Pull in the NuSOAP code  
  4. require_once(‘./lib/nusoap.php‘);  
  5. // Create the client instance  
  6. $client = new soapclient(‘http://localhost/soapTest/helloService.php?wsdl‘,true);  
  7. // Call the SOAP method  
  8. $param = array("name"=>"安迪");  
  9. $result = $client->call(‘hello‘, $param);  
  10. // Display the result  
  11. //print_r($result);  
  12.   
  13. if(!$err=$client->getError()){  
  14.     print_r($result );  
  15.     print(‘</br>‘);  
  16.     echo "程式返回: ", htmlentities($result,ENT_QUOTES,GB2312);  
  17. }  
  18. else{  
  19.     echo "錯誤: ", htmlentities($result,ENT_QUOTES,GB2312);  
  20. }  
  21.   
  22. echo   ‘ <h2> Request </h2> <pre> ‘   .   htmlspecialchars($client-> request,   ENT_QUOTES,GB2312)   .   ‘ </pre> ‘;   
  23. echo   ‘ <h2> Response </h2> <pre> ‘   .   htmlspecialchars($client-> response,   ENT_QUOTES,GB2312)   .   ‘ </pre> ‘;   
  24. echo   ‘ <h2> Debug </h2> <pre> ‘   .   htmlspecialchars($client-> debug_str,   ENT_QUOTES,GB2312)   .   ‘ </pre> ‘;   
  25.   
  26. ?>  

 

 

 

  Java代碼:

 

  注意: 要使用Axis1.x, 去官網不要下載了Axis2。好像Axis1.x 和 Axis2還是差別很大的,而且目前Axis1.x的文檔比較全點。這些是網上搜到的說法。

 

  如果需要使用中文參數調用Web Service,必須使用ISO-8859-1編碼參數,返回的Response再解碼。不要使用別的編碼,會出錯!

 

java代碼

       ...

 

java代碼

  1. import org.apache.axis.client.Service;  
  2.   
  3. <span style="color: #464646; font-family: simsun; line-height: 21px; text-align: left; white-space: normal; background-color: #ffffff;">import org.apache.axis.client.Call;</span>  
  4.   
  5. public class WebServiceTest {  
  6.     public static void main(String[] args) {  
  7.         String endpoint = "http://localhost/soapTest/helloService.php";  
  8.         //String endpoint = "http://testweb.dev.php/testWebService/testWebService.php";//該段就是上面剛將的地址   
  9.         Service service = new Service();  
  10.         Call call;  
  11.         try {  
  12.         call = (Call) service.createCall();  
  13.         call.setTargetEndpointAddress(new java.net.URL(endpoint));  
  14.         call.setOperationName("hello");  
  15.           
  16.   
  17.         String param = new String("安迪".getBytes(),"ISO-8859-1");//如果沒有加這段,中文參數將會亂碼  
  18.         //String param = new String("中文");  
  19.         String s = (String) call.invoke(new Object[] {param});  
  20.         s = new String(s.getBytes("ISO-8859-1"));//如果沒有轉換編碼,中文也會亂碼  
  21.         System.out.println(s);  
  22.         } catch (Exception e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  

Java 調用PHP的Web Service(三)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.