Gå til innhold

2 veis Webservices med PHP/SOAP?


Anbefalte innlegg

Blir litt mas idag, og det blir nok enda meir av det ut i veka :p

 

Eg held på å lage ein Webservice som skal fungerer slik:

 

Du åpner ein webside og skriver inn verdier om kva slags type værdata som skal hentes frå serveren. Det er implementert sånn at clienten kjører og ein webservice sånn at serveren får desse verdiane med ein SOAP spørring. På serveren så kjøres ein SQL kommando som henter desse dataene og ein webservice som kan sende resultatet.

 

Problemet er at det fungerer bare ein veg. Eg får ikkje til at serveren som oppfører seg først som ein client og så ein server

 

Det er 3 filer her:

 

index.php som lager siden der du putter inn verdiane for at serveren skal finna ut kva den skal leite etter.

 

server.php som gjer verdiane frå database klare for å sendes

 

client.php som henter desse verdiane.

 

Men server.php må hente verdier frå index.php for å kunne fullføre. Når eg implementerer ein SOAP request i server.php så får eg Apache til å gå heilt i stå :p

Apache må då manuelt restartes. Garantert brukerfeil, men vanskeleg å debugge :)

 

server.php ser sånn ut:

<?php

// Get the configured variables
require_once("inc/config.php");

$client = new SoapClient("wsdl/dbdata.wsdl");

$db_parameters = array(
0 => $client->getData("weatherstation"),
 	1 => $client->getData("element_measurement_type"),
2 => $client->getData("loginterval"),
3 => $client->getData("from_time"),
4 => $client->getData("to_time")
);

function getData($symbol) 
{
global $quotes;
return $quotes[$symbol];
}

$dbConnection = pg_connect("host=$dbinfo[host] dbname=$dbinfo[database] user=$dbinfo[user] password=$dbinfo[pass]")
or die('Could not connect: ' . pg_last_error());

$query =   "SELECT 
observation.time_measured AS time_measured,
observation.value_calculated AS value,
element_measurement_type_details.name AS element_measurement_type,
weatherstation.name AS weatherstation,
loginterval.loginterval_shortname AS loginterval

FROM observation, element_measurement_type_details, weatherstation, loginterval
WHERE observation.weatherstation_id=11
AND observation.element_measurement_type_id=1
AND observation.loginterval_id=1
AND observation.time_measured BETWEEN '2006-03-15 00:00:00' AND '2006-03-15 00:00:00'
AND element_measurement_type_details.element_measurement_type_id = observation.element_measurement_type_id
AND weatherstation.weatherstation_id = observation.weatherstation_id
AND loginterval.loginterval_id = observation.loginterval_id
ORDER BY observation.time_measured ASC";
   
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

if($result)
{
   for ($rowNumber = 0; $rowNumber < pg_NumRows($result); $rowNumber++)
   {
   	$row = pg_fetch_assoc($result);

 $wdata[0] = $row['time_measured'];
 $wdata[1] = $row['weatherstation'];
 $wdata[2] = $row['element_measurement_type'];
 $wdata[3] = $row['loginterval'];
 $wdata[4] = $row['value'];
}
}
// Free resultset
pg_free_result($result);

// Closing connection
pg_close($dbConnection);

$quotes = array(
 	"time_measured" => $wdata[0],
"weatherstation" => $wdata[1],
"element_measurement_type" => $wdata[2],
"loginterval" => $wdata[3],
"value" => $wdata[4]
);

// disabling WSDL cache
ini_set("soap.wsdl_cache_enabled", "0"); 
$server = new SoapServer("wsdl/wdata.wsdl");
$server-> addFunction("getData");
$server-> handle();
?> 

 

Prøver eg å løyse dette heilt feil? Eller er eg nesten der?

Lenke til kommentar
Videoannonse
Annonse

Då greide eg eg å løyse dette med ein liten vri, men eg er ikkje heilt i mål enda.

 

Nå må klienten lage to filer og *vite* kva den skal spør om i databasen.

 

Det blir sjåande sånt ut nå:

 

client_db_request.php

<?php

function getData($symbol) 
{
global $quotes;
return $quotes[$symbol];
}

/*$quotes = array(
"weatherstation" => $_POST['weatherstation'],
"element_measurement_type" => $_POST['measurement_type'],
"loginterval" => $_POST['interval'],
"from_time" => $_POST['from_time'],
"to_time" => $_POST['to_time']
);
*/
$quotes = array(
"weatherstation" => 11,
"element_measurement_type" => 1,
"loginterval" => 1,
"from_time" => '2006-03-15 02:00:00',
"to_time" => '2006-03-15 02:00:00'
);

// disabling WSDL cache
ini_set("soap.wsdl_cache_enabled", "0"); 

$server = new SoapServer("wsdl/db_request.wsdl");
$server-> addFunction("getData");
$server-> handle();
?>

 

server.php

<?php

// Get the configured variables
require_once("inc/config.php");

$client = new SoapClient("wsdl/db_request.wsdl");

$db_parameters = array(
0 => $client->getData("weatherstation"),
1 => $client->getData("element_measurement_type"),
2 => $client->getData("loginterval"),
3 => $client->getData("from_time"),
4 => $client->getData("to_time")
);

function getData($symbol) 
{
global $quotes;
return $quotes[$symbol];
}

$dbConnection = pg_connect("host=$dbinfo[host] dbname=$dbinfo[database] user=$dbinfo[user] password=$dbinfo[pass]") or die('Could not connect: ' . pg_last_error());

$query =   "SELECT 
observation.time_measured AS time_measured,
observation.value_calculated AS value,
element_measurement_type_details.name AS element_measurement_type,
weatherstation.name AS weatherstation,
loginterval.loginterval_shortname AS loginterval

FROM observation, element_measurement_type_details, weatherstation, loginterval
WHERE observation.weatherstation_id= $db_parameters[0] AND observation.element_measurement_type_id= $db_parameters[1] AND observation.loginterval_id= $db_parameters[2] AND observation.time_measured BETWEEN '$db_parameters[3]' AND '$db_parameters[4]' AND element_measurement_type_details.element_measurement_type_id= observation.element_measurement_type_id AND weatherstation.weatherstation_id= observation.weatherstation_id AND loginterval.loginterval_id= observation.loginterval_id
ORDER BY observation.time_measured ASC";

$result = pg_query($query) or die('Query failed: ' . pg_last_error());

if($result)
{
for ($rowNumber = 0; $rowNumber < pg_NumRows($result); $rowNumber++)
{
	$row = pg_fetch_assoc($result);

	$wdata[0] = $row['time_measured'];
	$wdata[1] = $row['weatherstation'];
	$wdata[2] = $row['element_measurement_type'];
	$wdata[3] = $row['loginterval'];
	$wdata[4] = $row['value'];
}
}
// Free resultset
pg_free_result($result);

// Closing connection
pg_close($dbConnection);

$quotes = array(
"time_measured" => $wdata[0],
"weatherstation" => $wdata[1],
"element_measurement_type" => $wdata[2],
"loginterval" => $wdata[3],
"value" => $wdata[4]
);

// disabling WSDL cache
ini_set("soap.wsdl_cache_enabled", "0"); 
$server = new SoapServer("wsdl/wdata.wsdl");
$server-> addFunction("getData");
$server-> handle();
?>

 

client.php

<?php

require_once("inc/template.class.php");

$client = new SoapClient("wsdl/wdata.wsdl");
$template = new Template;

$template->load("templates/printdata.tmp");
$template->replace("weatherstation", $client->getData("weatherstation"));
$template->replace("time_measured", $client->getData("time_measured"));
$template->replace("value", $client->getData("value"));
$template->replace("m_type", $client->getData("element_measurement_type"));
$template->replace("interval", $client->getData("loginterval"));
$template->publish();

?>

 

Det er ikkje så veldig elegant løsning. Korleis kan eg få bestemt desse variablane frå ein form? Saken er at når ein åpner index.php så skal ein få moglegheit til å velgja dei forskjellige værstasjonene osv også klikke submit for så å få opp tabellen med desse verdiane.

Lenke til kommentar

Då greide eg dette til slutt med å eksportere databaseverdiane som det skal søkes etter ved å leggja det i ein xml fil som client_db_request.php parset :)

 

Det som er litt rotete her er at klienten spør serveren om data utan at serveren enda veit kva slags data klienten spør etter. Sånn som eg har gjort det nå så spør serveren ein webservice hos klienten som parser XML fila og sender den tilbake til serveren sånn at den kan finn data i databasen levere det til klienten igjen.

 

Veldig lite elegant, men eg får sjå om eg får tid å rydde opp i det etterkvart.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...