我正在尋找使用jQuery/AJAX使用SOAP執行form(post)請求的方式。帶有身份驗證的PHP/jQuery/AJAX + POST SOAP請求
我發現了以下用於ColdFusion背景的jQuery/AJAX SOAP請求解決方案。
Posting XML SOAP Requests With jQuery
任何人都知道如何實現與PHP?
請注意:
- SSL連接將被要求
- 肥皂認證(用戶&通)是必需的。
任何幫助/建議非常感謝。
我正在尋找使用jQuery/AJAX使用SOAP執行form(post)請求的方式。帶有身份驗證的PHP/jQuery/AJAX + POST SOAP請求
我發現了以下用於ColdFusion背景的jQuery/AJAX SOAP請求解決方案。
Posting XML SOAP Requests With jQuery
任何人都知道如何實現與PHP?
請注意:
任何幫助/建議非常感謝。
SOAP請求例子:
<?php
//Data, connection, auth
$dataFromTheForm = $_POST['fieldName']; // request data from the form
$soapUrl = "https://connecting.website.com/soap.asmx?op=DoSomething"; // asmx URL of WSDL
$soapUser = "username"; // username
$soapPassword = "password"; // password
// xml post structure
$xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetItemPrice xmlns="http://connecting.website.com/WSDL_Service"> // xmlns value to be set to your's WSDL URL
<PRICE>'.$dataFromTheForm.'</PRICE> // data from the form, e.g. some ID number
</GetItemPrice >
</soap:Body>
</soap:Envelope>';
$headers = array(
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: http://connecting.website.com/WSDL_Service/GetPrice", // your op URL
"Content-length: ".strlen($xml_post_string),
);
$url = $soapUrl;
// PHP cURL for https connection with auth
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $soapUser.":".$soapPassword); // username and password - declared at the top of the doc
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // XML REQUEST
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// converting
$response = curl_exec($ch);
curl_close($ch);
// converting
$response1 = str_replace("<soap:Body>","",$response);
$response2 = str_replace("</soap:Body>","",$response1);
// convertingc to XML
$parser = simplexml_load_string($response2);
?>
顯示單個結果例子:
$getPrice = $parser->GetItemPriceResponse->PRICE;
if($getPrice) { // if found based on our $_POST entry echo the result
echo $getPrice;
} else { // if not found, echo error
echo "Sorry. No price tag for this item.";
}
顯示多個結果例如:
$getPrice = $parser->GetItemPriceResponse->PRICE;
if($getPrice) { // if found more than 0, return as a select dropdown
echo "<form action='soapMoreDetails.php' method='post'>";
echo "<select name='priceMoreDetails'>";
foreach ($parser->GetItemPriceResponse as $item) {
echo '<option value="'.$item->PRICE.'">';
echo $item->PriceBasedOnSize; // for e.g. different prices for different sizes
echo '</option>';
}
echo "</select>";
echo "<input type='submit'>";
echo "</form>";
} else {
echo "Sorry. No records found.";
}
我知道這是老了......但是我遇到了這個確切的問題(我用的是他的鏈路上的代理服務器和移動的,當我需要一個在PHP在工作中新的系統。)
如果有人有興趣,我翻譯他們的ColdFusion代理爲近似PHP當量(沒有錯誤檢查,但jQuery的AJAX調用是相同的,除了到PHP文件)
<?php
$action = $_SERVER['HTTP_SOAPACTION'];
$target = $_SERVER['HTTP_SOAPTARGET'];
$soap_body = file_get_contents('php://input');
$headers = array(
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: ".$action,
"Content-length: ".strlen($soap_body),
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $target);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soap_body);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
echo($response);
?>
這是一個鏈接請參閱調用此代理所需的html和javascript/jquery。 http://www.bennadel.com/blog/1853-Posting-XML-SOAP-Requests-With-jQuery.htm
我試圖與Ajax客戶端SOAP PHP服務器,發現從Here
工作代碼
首先下載的NuSOAP庫,然後創建服務器。PHP
<?php
//call library
require_once ('lib/nusoap.php');
// Define the TriangleArea method as a PHP function
function TriangleArea($b, $h) { return 'The triangle area is: ' .(($b*$h)/2); }
// Define the RectangleArea method as a PHP function
function RectangleArea($L, $l) { return 'The rectangle area is: ' .($L*$l); }
// create the function
function get_message($your_name)
{
if(!$your_name){
return new soap_fault('Client','','Put Your Name!');
}
$result = "Welcome to ".$your_name .". Thanks for Your First Web Service Using PHP with SOAP";
return $result;
}
//using soap_server to create server object
$server = new soap_server;
// Initialize WSDL support
$server->configureWSDL('mathwsdl', 'urn:mathwsdl');
// Register the TriangleArea method
$server->register('TriangleArea', // method name
array('b' => 'xsd:int', 'h' => 'xsd:int'), // input parameters
array('area_t' => 'xsd:string'), // output parameters
'urn:mathwsdl', // namespace
'urn:mathwsdl#TriangleArea', // soapaction
'rpc', // style
'encoded', // use
'1=> : Calculate a triangle area as (b*h)/2' // documentation
);
// Register the RectangleArea method to expose
$server->register('RectangleArea', // method name
array('L' => 'xsd:int', 'l' => 'xsd:int'), // input parameters
array('area_r' => 'xsd:string'), // output parameters
'urn:mathwsdl', // namespace
'urn:RectangleAreawsdl#RectangleArea', // soapaction
'rpc', // style
'encoded', // use
'2=> : Calculate a rectangle area as (L*l)' // documentation
);
// Register the RectangleArea method to expose
$server->register('get_message', // method name
array('nm' => 'xsd:string'), // input parameters
array('area_r' => 'xsd:string'), // output parameters
'urn:mathwsdl', // namespace
'urn:get_messagewsdl#get_message', // soapaction
'rpc', // style
'encoded', // use
'3=> : Print a Message as name' // documentation
);
if (!isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA =file_get_contents('php://input');
$server->service($HTTP_RAW_POST_DATA);
// create HTTP listener
//$server->service($HTTP_RAW_POST_DATA);
exit();
?>
後
創建client.php
<?php
require_once ('lib/nusoap.php');
//Give it value at parameter
$param = array('your_name' => 'Monotosh Roy');
//Create object that referer a web services
$client = new soapclient('http://localhost:81/WebServiceSOAP/server.php?wsdl', true);
// Check for an error
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
// At this point, you know any calls to
// this web service's methods will fail
}
// Call the TriangleArea SOAP method
$result = $client->call('TriangleArea',
array('b' => 10, 'h' => 15));
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
// Call the RectangleArea SOAP method
$result = $client->call('RectangleArea',
array('L' => 40, 'l' => 20));
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
// Display the request and response
/* echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request,
ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response,
ENT_QUOTES) . '</pre>';*/
//Call a function at server and send parameters too
$response = $client->call('get_message',$param);
//Process result
if($client->fault)
{
echo "<h2>FAULT:</h2> <p>Code: (".$client->faultcode."</p>";
echo "String: ".$client->faultstring;
}
else
{
echo $response;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title>Web Service SOAP and AJAX</title>
</head>
<script type="text/javascript" src="ajaxSOAP.js"></script>
<body>
<div style="position:relative;left:0px;
top:-12px;background-color:#1D3968;margin:0px;">
<h2 align="center"><font color="#ffffff">
Consume WebServices through SOAP-AJAX calls</font></h2></div>
<table align="center" cellpading="0px" cellspacing="3px"
bordercolor="#000000" border="0"
style="position:relative;width:300px;height:200px;">
<tr>
<td colspan="2" align="center"><h1>Rectangle Area</h1></td>
</tr>
<tr>
<td valign="center"><font color="#cc0000" size="3">
Insert value for l:</font></td>
<td><input id="l_id" type="text"></td>
</tr>
<tr>
<td><font color="#cc0000" size="3">Insert value for L:</font></td>
<td><input id="L_id" type="text"></td>
</tr>
<tr>
<td><input type="button" value="Calculate Area" onclick="myAjax();"></td>
</tr>
<tr>
<td colspan="2">
<div id="resultDiv"></div>
</td>
</tr>
</table>
</body>
</html>
ajaxSOAP.js文件包含
var xhrTimeout=100;
function myAjax(){
var l_var = document.getElementById("l_id").value;
var L_var = document.getElementById("L_id").value;
var soapMessage ='<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:mathwsdl"> <SOAP-ENV:Body><tns:RectangleArea xmlns:tns="urn:mathwsdl"><L xsi:type="xsd:int">'+L_var+'</L><l xsi:type="xsd:int">'+l_var+'</l></tns:RectangleArea></SOAP-ENV:Body></SOAP-ENV:Envelope>';
var url='http://localhost:81/WebServiceSOAP/server.php';
if(window.XMLHttpRequest) {
httpRequest=new XMLHttpRequest();
}
else if (window.ActiveXObject) {
httpRequest=new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.open("POST",url,true);
if (httpRequest.overrideMimeType) {
httpRequest.overrideMimeType("text/xml");
}
httpRequest.onreadystatechange=callbackAjax;
httpRequest.setRequestHeader("Man","POST http://localhost:81/WebServiceSOAP/server.php HTTP/1.1")
httpRequest.setRequestHeader("MessageType", "CALL");
httpRequest.setRequestHeader("Content-Type", "text/xml");
httpRequest.send(soapMessage);
}
function callbackAjax(){
try {
if(httpRequest.readyState==4) {
if(httpRequest.status==200) {
clearTimeout(xhrTimeout);
resultDiv=document.getElementById("resultDiv");
resultDiv.style.display='inline';
resultDiv.innerHTML='<font color="#cc0000" size="4"><b>'+httpRequest.responseText+'</b></font>';
}
}
} catch(e) {
alert("Error!"+e);
}
}
一個SSL連接不依賴於PHP,但對網絡服務器。如何在PHP中實現SOAP:http://www.vankouteren.eu/blog/2009/03/simple-php-soap-example/ http://www.google.com/search?hl=all&q=php+soap + example http://de2.php.net/manual/en/book.soap.php – feeela
您將需要移植[coldfusion XML代理](http://www.bennadel.com/blog/1853-Posting- XML-SOAP-Requests-With-jQuery.htm#blogEntryContent)到PHP。 PHP支持閱讀輸入,但也可以參見[獲取原始發佈數據](http://stackoverflow.com/questions/1361673/get-raw-post-data)。 – hakre
一些有用的鏈接http://bisqwit.iki.fi/story/howto/phpajaxsoap/ http://www.sks.com.np/article/8/xml-web-service-using-php-and-soap。 html http://code.google.com/p/jquerywebserviceplugin/updates/list – zod