Multidesk.be » Forums » PHP » MonoDevelop/Visual Studio compatible PHP Webservice class

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door thekid op woensdag 7 november 2012 om 16:29:26.
thekid's avatar
Multiviteit: 5273
Moderator
Ik vroeg mij nu eens af, is dit voor sommigen interresant om te hebben of niet?

De output kan volledig opgevangen worden via MonoDevelop & Visual Studio (inclusief de types van de objecten (alhoewel je in de php service de handling natuurlijk wel nog zelf moet verifieren)). Het staat ook toe om complexe types als vraag of antwoord te gebruiken (en dus te laten autogenereren als klasse in MonoDevelop/Visual studio).

Per default worden alle parameters als string doorgegeven, alsook alle results. Door het toevoegen van types voor antwoord/parameternamen kan je wel bepalen hoe het uit de service reference komt. Hierdoor zijn ook de complexe types mogelijk.

Een mogelijke extensie zou zijn om nog json input/output toe te laten, dat moet ik nog overwegen.

Een werkende versie van de service kan je terugvinden op:

http://www.pynoojp.be/data.php

en de voorbeeldcode van deze webservice voeg ik hier toe

PHP
  1. <?php
  2. include('serviceHandler.php');
  3.  
  4. class data
  5. {
  6.   public function Sum($a,$b) {
  7.     return (int)$a+(int)$b;
  8.   }
  9.  
  10.   public function Subtract($a,$b) {
  11.     return (int)$a-(int)$b;
  12.   }
  13.  
  14.   public function Multiply($a,$b) {
  15.     return (int)$a*(int)$b;
  16.   }
  17.  
  18.   public function Divide($a,$b) {
  19.     if (((int)$b) != 0)
  20.       return (int)((int)$a/(int)$b);
  21.     return 0;
  22.   }
  23.  
  24.   public function ConvertToIban($bban) {
  25.     if (!isset($bban) | $bban == '')
  26.       return 'no valid input given';
  27.     $iban = CodeHelper::ScrapSigns($bban, 'ABCDEFGHIJKLMNROPQRSTUVWXYZ -_%=:;,"&@(^!{})$*"^%~=+:/;.,?<>\').'BE00';
  28.     $iban = CodeHelper::ReplaceAlfaWithValue($iban);
  29.     $longvalue = 98 - CodeHelper::RestAfterDivision((int)$iban, 97);
  30.     return 'BE'.((int)$longvalue > 10 ? strval($longvalue) : '0'.strval($longvalue)).CodeHelper::ScrapSigns($bban, 'ABCDEFGHIJKLMNROPQRSTUVWXYZ -_%=:;,"&@(^!{})$*"^%~=+:/;.,?<>\');
  31.   }
  32.  
  33.   public function getPerson($fulldescription) {
  34.     $fields = explode(';', $fulldescription);
  35.     $name = isSet($fields[0]) ? explode(',', $fields[0]) : array();
  36.     return array(
  37.       'FirstName' => isSet($name[0]) ? $name[0] : '',
  38.       'LastName' => isSet($name[1]) ? str_replace(' ', '', $name[1]) : '',
  39.       'Email' => isSet($fields[1]) ? $fields[1] : '',
  40.       'Tel' => isSet($fields[2]) ? $fields[2] : ''
  41.       );
  42.   }
  43.  
  44.   public function personToString($person) {
  45.     return $person['FirstName'].', '.$person['LastName'].';'.$person['Email'].';'.$person['Tel'];
  46.   }
  47. }
  48.  
  49. class CodeHelper
  50. {
  51.   public static function ScrapSigns($strValue, $signs) {
  52.     $strvalue = strtolower($strValue);
  53.     $x = 0;
  54.     for ($x = 0; $x < strlen($signs); $x++) {
  55.       $char = $signs[$x];
  56.       $strValue = str_replace($char, '', $strValue);
  57.     }
  58.     return $strValue;
  59.   }
  60.  
  61.   public static function ReplaceAlfaWithValue($strValue) {
  62.     $signs = 'ABCDEFGHIJKLMNROPQRSTUVWXYZ';
  63.     $output = '';
  64.     $x = 0;
  65.     for ($x = 0; $x < strlen($strValue); $x++)
  66.     {
  67.       $char = $strValue[$x];
  68.       if (strstr($signs, $char)) {
  69.         $output .= strval(10 + strpos($signs, $char));
  70.       } else {
  71.         $output .= $char;
  72.       }
  73.     }
  74.     return $output;
  75.   }
  76.  
  77.   public static function MatchesRestAfterDivision($number, $divide, $result) {
  78.     return CodeHelper::RestAfterDivision($number, $divide) == $result;
  79.   }
  80.  
  81.   public static function RestAfterDivision($number, $divide) {
  82.     return (int)$divide != 0 ? (int)$number % (int)$divide : (int)$number;
  83.   }
  84. }
  85. // initiate instance of class that needs handling
  86. $d = new data();
  87. // start service handler with associated class
  88. $s = new serviceHandler($d, 'http://tempuri.org/', 'http://www.pynoojp.be/servicedemo.php?WSDL');
  89.  
  90. // Though reflection is being used, we can set the correct data types here for aswell response as request
  91. // data::Sum
  92. $s->addMethodParameterType('Sum','a','s:int');
  93. $s->addMethodParameterType('Sum','b','s:int');
  94. $s->addMethodParameterType('Sum','SumResult','s:int');
  95.  
  96. // data::Subtract
  97. $s->addMethodParameterType('Subtract','a','s:int');
  98. $s->addMethodParameterType('Subtract','b','s:int');
  99. $s->addMethodParameterType('Subtract','SubtractResult','s:int');
  100.  
  101. // data::Multiply
  102. $s->addMethodParameterType('Multiply','a','s:int');
  103. $s->addMethodParameterType('Multiply','b','s:int');
  104. $s->addMethodParameterType('Multiply','MultiplyResult','s:int');
  105.  
  106. // data::Divide
  107. $s->addMethodParameterType('Divide','a','s:int');
  108. $s->addMethodParameterType('Divide','b','s:int');
  109. $s->addMethodParameterType('Divide','DivideResult','s:int');
  110.  
  111. // data::personToString
  112. $s->addMethodParameterType('personToString', 'person', 'tns:Person');
  113.  
  114. // data::getPerson
  115. $s->addComplexType('Person','getPersonResult',array('FirstName' => 's:string', 'LastName' => 's:string', 'Email' => 's:string', 'Tel' => 's:string'));
  116.  
  117. // let the http request be parsed
  118. // either show:
  119. // - html interface
  120. // - operation guide
  121. // - wsdl description
  122. //
  123. $s->allowTestForm(false);
  124. $s->parseRequest();
  125. ?>


alsook indien je opmerkingen hebt over hoe ik de php schreef, laat maar weten, ik ben er eigenlijk een leek in :)

en nog als screenshot toevoegen

MonoDevelop web reference

http://www.multidesk.be/bijlage/03b972c957861eaf76ec98bbaa476883.png


Visual Studio service reference

http://www.multidesk.be/bijlage/ea6fc29a8a36ca3d0ea66061e0e8956b.png


De serviceHandler.php file heb ik bewust nog niet opgeladen. Mensen die deze nodig hebben of deze wil moeten mij maar PM'n. De code ben ik in een iets properdere versie aan het gieten. Afhankelijk van de vraag zou ik deze dan hier releasen of niet :)
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #1 geschreven door Simon op woensdag 7 november 2012 om 18:14:17.
Simon's avatar
Multiviteit: 3742
Misschien een stomme vraag maar: Wat is een webservice class precies? Wat kan je er mee doen?
^ Reactie #2 geschreven door thekid op woensdag 7 november 2012 om 18:26:24.
thekid's avatar
Multiviteit: 5273
Moderator
Het is een manier om aan datacommunicatie te doen via SOAP.

De servicehandler maakt alle publieke functies in de aangegeven klasse beschikbaar op het internet.

Via bvb visual studio of monodevelop, kan ik dan communiceren met dat adres via het oproepen van de service (alles is vrij geautomatiseerd).

Zo kan je data die beschikbaar is voor je website, maar waar je geen directe toegang hebt vanaf jouw pc, beschikbaar maken via een webservice. Je kan de data dan oproepen, wijzigen en verwijderen vanaf de lokale pc. Via de service kan je dan ook alle validatie doen van de gebruiker, zodat het ook veilig kan gebeuren.

Wikipedia legt het zo uit
http://en.wikipedia.org/wiki/Web_service
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen