Avatar billede riversen Nybegynder
11. januar 2009 - 07:28 Der er 27 kommentarer og
1 løsning

webservices med php

Hej,

skal for første gang til at lave en webservice. Har I nogle gode links og tips til at komme godt i gang?

Jeg tror det er ret simpelt. Ihvert fald skal det ende ud med at klient giver et id, hvorefter serveren instantierer et objekt, hvis data returneres.

Hvis det har nogen betydning køres PHP 5.2.6 på IIS6.
Avatar billede riversen Nybegynder
11. januar 2009 - 07:33 #1
Min opgave er helt konkret: "levere data gennem en standard Web Service med tilhørende WSDL dokument"
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 10:26 #2
Man kan selv skrive sin WSDL-definition - evt ved at ændre i een der ligner. Med .NET og Visual Studio kan man nemt lave een, og tilpasse den. Det har jeg gjort engang.

Ellers er der mig bekendt ikke nogen helt rigtig officiel måde at få et WSDL-definition genereret automatisk. Bedste bud for tiden er "WSDL Writer" vedligeholdt af "katy". Sitet svarere ikke her til morgen: http://www.djkaty.com/php-wsdl - google cache kan bruges.

Og til alt det andet kan man vist bruge http://php.net/soap
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 10:28 #3
Jeg har meget lidt erfaring med ovenstående - tidligere har jeg brugt http://sourceforge.net/projects/nusoap/
Avatar billede riversen Nybegynder
11. januar 2009 - 10:51 #4
Har fundet det her http://www.ferdychristant.com/blog/articles/DOMM-6J2QFF. Jeg har et enkelt spørgsmål. I server.php står der fx "xsd:integer". Jeg går ud fra det er en eller anden standard for typeangivelse. Hvor kan jeg se, hvilke typer der findes?
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 11:07 #5
Du kan klare dig langt xsd:integer xsd:string xsd:double. Ellers er der diverse lister, fx. http://infohost.nmt.edu/tcc/help/pubs/rnc/xsd.html
Avatar billede riversen Nybegynder
11. januar 2009 - 12:29 #6
hmmm...har prøvet det jeg linkede til. Server delen gør som beskrevet, men kører jeg klienten får jeg absolut intet output.
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 13:06 #7
Prøv "print"  ;)

Jamen, så må der jo være noget galt.
Avatar billede riversen Nybegynder
11. januar 2009 - 13:14 #8
det stod i nogle af kommentarerne. Jeg er videre, men lader lige spørgsmålet stå åbent, hvis der skulle komme mere. I mellem tiden kan du jo ulejlige dig med at lægge et svar ;).
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 13:30 #9
Nej tak - jeg samler slet ikke på point.
Avatar billede riversen Nybegynder
12. januar 2009 - 10:45 #10
Jeg har fået at vide man gerne vil have, jeg returnerer objekter eller arrays af objekter. Jeg kan simpelthen ikke se, hvordan det skulle være muligt. Når man kigger på xsd datatypes i dit link, er det meste jo også simple typer.
Avatar billede erikjacobsen Ekspert
12. januar 2009 - 11:04 #11
Du kan ikke returnere objekter, per se. SOAP er platformsuafhængig. Men et objekts felter bliver typisk oversat til denne slags WSDL-definition:

<xs:sequence>
<xs:element minOccurs="1" name="zz" nillable="true" type="xs:string"/>
<xs:element minOccurs="1" name="xx" nillable="true" type="xs:string"/>
<xs:element minOccurs="1" name="cc" nillable="true" type="xs:string"/>
<xs:element minOccurs="1" name="rr" nillable="true" type="xs:string"/>
<xs:element minOccurs="1" name="rr" nillable="true" type="xs:string"/>
</xs:sequence>

som webservice klienten kan vælge at lave til et objekt i sit underliggende programmeringssprog.
Avatar billede riversen Nybegynder
12. januar 2009 - 13:48 #12
kan du give et eksempel med NuSOAP?
Avatar billede erikjacobsen Ekspert
12. januar 2009 - 13:52 #13
Et eksempel på hvad? Der er mange eksempler på nettet, fx http://www.scottnichol.com/soap.htm
Avatar billede riversen Nybegynder
14. februar 2009 - 08:39 #14
betragt mig som fuldstændig nybegynder... kan du ikke vise, hvad det præcist er du tænker på.
Avatar billede erikjacobsen Ekspert
14. februar 2009 - 09:53 #15
Jeg har ikke noget præcist i tankerne, men hvis du kan komme med et præcist eksempel på hvad du skal, så vil jeg gerne prøve at komme tættere på.
Avatar billede riversen Nybegynder
14. februar 2009 - 11:33 #16
bare hvordan man overfører et objekt. Fx et person objekt med attributterne navn og alder... evt. også andre objektattributter.
Avatar billede erikjacobsen Ekspert
14. februar 2009 - 13:13 #17
Ok, jeg har strikket et lille eksempel sammen. Ligger på http://n0p.com/soap/webservice1.php med WSDL på http://n0p.com/soap/webservice1.php?wsdl

PHP koden er (ikke så pæn, men...)

<?php
  header("Connection: Close");
    // includes nusoap classes
    require('lib/nusoap.php');
    // create server
    $l_oServer = new soap_server();
    // wsdl generation
    $l_oServer->debug_flag=false;
   
    $l_oServer->configureWSDL('Webservice1', 'http://n0p.com/soap');
    $l_oServer->wsdl->schemaTargetNamespace = 'http://n0p.com/soap';
    // add complex type
    $l_oServer->wsdl->addComplexType(
        'personitem',
        'complexType',
        'struct',
        'all',
        '',
        array(
            'navn' => array('name'=>'navn', 'type'=>'xsd:string'),
            'adresse' => array('name'=>'adresse', 'type'=>'xsd:string'),
            'iq' => array('name'=>'iq', 'type'=>'xsd:int'))
    );


    $l_oServer->wsdl->addComplexType('personitems',
                'complexType',
                'array',
                '',
                'SOAP-ENC:Array',
                array(),
                array(
                    array('ref'=>'SOAP-ENC:arrayType',
                    'wsdl:arrayType'=>'tns:personitem[]')
                ),
                'tns:personitem'
            );



    // register method

    $l_oServer->register('getPerson',
            array('id' => 'xsd:int'),
            array('return' => 'tns:personitem'),
            'Webservice1',
            'Webservice1#getPerson',
            'rpc',
            'encoded',
            'Returns the data for a person'
        );


    $l_oServer->register('getPersons',
            array('query' => 'xsd:string'),
            array('return' => 'tns:personitems'),
            'Webservice1',
            'Webservice1#getPersons',
            'rpc',
            'encoded',
            'Returns the data for every person'
        );



    // method code (get DB result)



function getPerson($id) {
        return array('navn' => "Pia $id",
                'adresse' => "Hovedgaden $id",
                'iq' => $id
            );
}


    function getPersons ($antal) {
          $personlist = array();
      for ($i=0;$i<$antal;$i++) {
          $personlist[] = array('navn' => "Pia $i", 'adresse' => "Hovedgaden $i", 'iq' => 50+$i);
      }
        //$persons = array('personitem' => $personlist);
        return $personlist; 
    }



    // pass incoming (posted) data

    $l_oServer->service($HTTP_RAW_POST_DATA);

?>

og et lille testprogram i .NET (VB.NET) efter denne webservice er added:


Imports System.net.configuration
Imports System.configuration

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim aaa As New com.n0p.Webservice1()
        Dim c As com.n0p.personitem = aaa.getPerson(33)
        MessageBox.Show(c.navn & " " & c.adresse & " " & c.iq)

        Dim b As com.n0p.personitem() = aaa.getPersons(8)
        For i As Int32 = 0 To b.Length - 1
            MessageBox.Show(b(i).navn & " " & b(i).adresse & " " & b(i).iq)

        Next

    End Sub
End Class

Man definerer altså de complextypes man har brug for. Og det er ikke ligetil - jeg har skrevet af fra et eller andet.
Avatar billede riversen Nybegynder
14. februar 2009 - 13:56 #18
mange tak... jeg leger med det i løbet af den kommende uge håber jeg på.
Avatar billede riversen Nybegynder
14. februar 2009 - 13:57 #19
flot side du har iøvrigt ;)
Avatar billede erikjacobsen Ekspert
14. februar 2009 - 14:32 #20
Ok - spørg og del med os hvad du finder ud af. Jeg kan se at nusoap er kommet længere, så den selv kan lave en WSDL-definition. Men da PHP så'n set ikke er typestærk, skal man specficere hvad der er hvad. Det var såmænd sjovt at lave et gammelt eksempel om. Ok - helt om ;)
Avatar billede riversen Nybegynder
18. februar 2009 - 11:31 #21
tak for det. Det ser ud til at spille. I hvert fald har jeg downloade en klient, som ser ud til at forstå svaret der sendes retur ganske fint. Så nu håber jeg det er det de vil have.

Læg et svar for point.
Avatar billede erikjacobsen Ekspert
18. februar 2009 - 11:46 #22
"Flot side" ... hehe ... hvad for een af dem?

Men jeg samler slet ikke på point, tak.
Avatar billede riversen Nybegynder
18. februar 2009 - 12:26 #23
ja, det var den.

havde helt glemt det igen med ingen point :)
Avatar billede riversen Nybegynder
20. februar 2009 - 09:59 #24
hej igen.

Et enkelt problem har meldt sig. Hvis nogle af felterne indeholder æøå får jeg vist noget volapyk... fx. Hovedg���aden (med udgangspunkt i dit eksempel). Faktisk værdi er Hovedgæøåaden.

Jeg har sat "var $soap_defencoding = 'ISO-8859-1';" i nusoap_base klassen.
Avatar billede erikjacobsen Ekspert
20. februar 2009 - 12:06 #25
Det er noget med tegnsæt, sjovt nok. Og forkert valgt tegnsæt. Jeg kan ikke komme det nærmere lige nu.
Avatar billede riversen Nybegynder
20. februar 2009 - 12:44 #26
ja, det var også min formodning... prøver at lege lidt videre. Måske min testklient er sat forkert.
Avatar billede riversen Nybegynder
20. februar 2009 - 12:46 #27
tror jeg faktisk det er. Prøvede lige en anden klient, hvor jeg kan se xml'en... der er æøå som de skal være
Avatar billede erikjacobsen Ekspert
20. februar 2009 - 12:51 #28
"der er æøå som de skal være " - det er en farlig udtalelse. Nogle folk kunne tro på det.

Man kan ikke sige "der er æøå som de skal være" førend man konstaterer hvilket tegnsæt, der er anvendt til teksten, og hvilket tegnsæt man ser teksten som.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester