18. oktober 2007 - 12:12Der er
47 kommentarer og 1 løsning
Fra c# til php og MySQL med Soap
Hej
Jeg har udviklet et databasebaseret program, men har fået det problem at jeg ikke kan tilgå SQL fra remote connections.
En kollega har nu fortalt mig at jeg kan bruge en webservice kaldet SOAP.
Jeg har udviklet programmet objektorienteret og lagdelt. Så jeg har en klasse der indeholder alle kald mellem programmet og databasen.
Denne dataklasse vil jeg gerne have kodet om, så den istedet sender data med soap til et phpscript på serveren der derefter udfører de ting til databasen som skal klares.
Jeg vil ikke sidde her på eksperten og bede jer kode hele mit program om.
Men jeg vil gerne guides igennem at lave et lille miniprogram der opretter et element i en database, kalder nogle data fra databasen og udføre en update og en slet.
Så kan jeg altid selv rette program til når jeg har lært hvordan det fungere.
Håber der sidder en derude der har lyst til at guide mig igennem dette :)
Det lyder mere som om at det er i PHP enden at du skal lave din webservice. C# bliver nødt til at have noget den kan kalde (webservicen) for at det kan lade sig gøre.
Du behøver dog ikke at kaste dig ud i websrvise løsninger - det kan (nok) også gøres ved en almindelig form-baseret løsning, hvir dit C# program så at sige submitter til en form på din PHP side.
PS: SOAP er ikke en webservice - det er en XML baseret protokol som bl.a. bruges af webservices.
Det er klart at en webservice ville være ideelt til formålet. Men den skulle så oprettes i PHP. Jeg har ingen ide om dette er nemt eller svært, men det ville så nok være medst at flytte spørgsmålet til PHP kategorien.
Sikkert - det afhænger af hvad du mener med sikkert. Løsningen bliver ikke automatisk sikker fordi at det foregår via en WS. En mulig måde at beskytte sig på er ved at lade det gå via SSL og så skal der formentligt noget login på.
En FORM løsning ligger sig selbfølgelig mest op af at der sendes data, men du kan jo sagtens lave en side som viser data (altså et udtræk) ud fra givne søgekriterier. I C# kan du så tygge dig igennem HTML koden på denne side og omsætte det til C# variable - det kaldes for "screenscraping".
Man tilføjer en Web Reference i sit projekt :P... Og så nemt er det (næsten)...
det vil dog sige meget afhængigt af det data der skal sendes... Har du nogle Business/Domain Objecter du ønsker at sende frem og tilbage med referancer til andre object ect. ect. kan det hurtigt blive ganske advanceret... er det derimod simple dataHolder klasser du vil transportere eller endnu simplere datatyper som int, string ect. så er det ganske overkommeligt...
Oki.. Men jeg kan ikke rigtigt finde den reference jeg skal tilføje :S Hvad er det helt nøjagtigt jeg skal tilføje?
Jeg har en dataklasse i mit system jeg gerne vil erstatte med kommunikationen mellem klienten og serveren. Og den dataklasse adder selv til mine collection klasser, hvor de skal bruges, så hvis jeg fx kan sende et postnr ind i databasen og få en array af brugere retur er det fint nok.
Når jeg adder noget skal jeg bare kunne smide flere forskellige varibler ind, fx string, string, int, datetime osv. Det kan vel godt gøres rimelig simpelt?
Der må jeg desvære mælde pas... har ikke arbejdet meget med WebServices... så har jeg ikke kendskab til. og slet ikke hvis det ikke er dig der kører serveren selv...
men prøv at bladre rundt på google efter noget (PHP?) Web Service Permissions måske?
For lige at få koden på plads - der er4 en den "sjove" HTML-koder hist og her. Den skulle nok se sådan her ud:
<?php class MySoapServer extends soap_server { var $_objParser;
// Class constructor function MySoapServer($wsdl=false) { // Create a new instance of the XML parser $this->_objParser = new MyXMLParser();
// Call the parent constructor method and pass the WSDL flag to it parent::soap_server($wsdl); } // End Function
function service($data) { // Parse the xml message $this->_objParser->setXMLData($data);
// Retrieve the authentication information from the xml message $arrCredentials = $this->_objParser->getCredentials();
// Sanity check - did we get the credentials? if (is_array($arrCredentials) && ($arrCredentials["username"] != "") && ($arrCredentials["password"] != "")) { // Authenticate the user $this->_intWSUserID = $this->_authenticate($arrCredentials);
// If authentication was successful, handle the rest of the message if ($this->_intWSUserID > 0) { parent::service($data); } else { // return a SOAP fault } } } // End Function
function _authenticate($arrCredentials) { // Sanity check: did we get a valid array? if (! is_array($arrCredentials)) { // return a SOAP fault }
// Handle your authentication code here. I use a MySQL database for holding user data } // End Function } // End of Class ?>
Denne modtager et PHP array med login-informationerne - et array med credentials. Den helt simple implementering af denne ville være at hardkode tjekket ind:
function _authenticate($arrCredentials) { // Sanity check: did we get a valid array? if (! is_array($arrCredentials)) { // return a SOAP fault } else if ($arrCredentials["username"] != "vivaa.dk" || $arrCredentials["password"] != "hemmelgt") { // return a SOAP fault } else { return 1; // Jeg har ikke noget bedre bud. } } // End Function
Han nævner selv at han bruger en database. Det er til hvis han ønsker at kunne styre login-informationerne derfra i stedet for at hardcode dem ind i PHP scriptet. En sådan stumpr kode ville simpelthen ligne et almindeligt loginscript skrevet i PHP og baseret på f.eks. MySQL.
PS: Jeg har ikke lige nogen ide om hvad det betyder at "returnere en SOAP fejl". Det må stå nærmere beskrevet i NuSOAP dokumentationen.
PPS: Dette spørgsmål er som sagt mere et PHP spørgsmål end et C# ditto...
det er også fint nok :) Har dog fået et problem med at køre soap på mit webhotel :S
Jeg kørte det på min laptop før, der kører WAMP server, uden problemer..
Nu sidder jeg ved min stationære PC der kører XAMMP og får følgene fejl: Fatal error: Cannot redeclare class soapclient in /mounted-storage/home26b/sub002/sc24152-ERZJ/Ole/soap/lib/nusoap.php on line 7240
Og smider jeg det op på webhotellet får jeg samme fejl :S
Ved godt at mit spørgsmål er besvaret, men hvis i lige har et hurtigt bud på det ville det være super :)
Mit forslag er at Nielle får 150 point og mr_craig får 50 points, kan det accepteres? :)
Den skal vist ikke nødvendigvis returnere noget bestemt ... det vigtigste er blot at den skal smide en fault (kase en exception) hvis authorizationen fejler.
Som jeg læser koden er det antydet at han - i hans - løsning blot returnere brugeres id som det er sat i databasen.
Det fremgår ikke rigtigt hvilken XML parser han bruger, men det er formentligt også ligegyldigt; hvis man kan finde en så kan man bruge den.
I PHP 5 er der faktisk kommet en ganske udemærket XML undersøttelse, så det er nærliggende at bruge den hvis det ellers er muligt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.