2009-09-04 46 views
2

好吧n00b這裏用SOAP,如何在PHP中獲取SOAP帖子?

想了解一下如何使用SOAP。

問:

我有一個Java JSP是職位WSDL(貌似XML格式)到我的PHP腳本,但我如何得到這個在PHP腳本? WSDL的URL每次都會有所不同。

我敢肯定它非常簡單,但只是看不清楚我是怎麼理解的?

回答

6

你可以嘗試這樣的事情:

 
try {                                           
    if (!($xml = file_get_contents('php://input'))) { 
    throw new Exception('Could not read POST data.'); 
    } 
} catch (Exception $e) { 
    print('Did not successfully process HTTP request: '.$e->getMessage()); 
    exit; 
} 

這將讀取POST請求$ xml變量的身體,如果有一個打印錯誤。

+0

從未見過這個「php://輸入」,這是否讀取RAW文章數據? – 2009-09-04 15:05:37

+0

感謝這很好的工作 – 2009-09-04 15:36:25

0

您的意思是JSP將POST請求中的WSDL發送給PHP腳本? 如果是這樣,看看$ _POST數組。如果您確切地指定JSP如何發送它,我可以幫助您更多。

無論如何,一旦你在你的PHP腳本中的一個變量中有WSDL url,你可以使用SoapClient類。

+0

是的,這是我在談論的路線,所以也許我可以只是消耗RAW文章並解析它呢? – 2009-09-04 15:04:02

0

假設最好的情況:

$soapClient = new SoapClient($wsdlUrl, $soapOptions); 
$soapClient->callYourMethod(); 

但你很可能會使用SOAP時打了很多的磚牆。這是documentation for SoapClient

編輯:

因此,WSDL是POST-ED。然後,如果將XML字符串作爲HTTP主體發送,則可以使用$HTTP_RAW_POST_DATA,如果XML字符串作爲多部分請求的一部分發送,則可以通過使用超全局$_FILES來訪問它。

事情是這樣的:

$wsdl = $HTTP_RAW_POST_DATA; 
$wsdlUrl = 'data:text/xml;base64,' . base64_encode($wsdl); 
$soapClient = new SoapClient($wsdlUrl); 

無論如何,如果php.ini always_populate_raw_post_data被打開$HTTP_RAW_POST_DATA纔可用。此外,如果請求是多部分,則忽略此設置,但未填充$HTTP_RAW_POST_DATA,但您可以使用$_FILES訪問已發佈的零件。而且,你的確可以使用php://input而不是$HTTP_RAW_POST_DATA

另外,data URIs只能在php.ini中打開allow_url_fopen時使用。

+0

但我如何獲得$ wsdlUrl?這是什麼改變每次我需要PHP腳本處理 – 2009-09-04 15:04:42

+0

這裏的URL包含數據本身:URL協議不是http,而是數據。如果SoapClient類處理這個,那麼這是最好的解決方案。 – gnud 2009-09-04 16:58:58