Loading ...
Sorry, an error occurred while loading the content.

Re: Can the server process parameters by name?

Expand Messages
  • paulclinger@yahoo.com
    Hi, Chris! ... Truly only you can decide. How it happens usually: you write server and advertise methods and parameters, so everybody can use it. If your
    Message 1 of 26 , May 14, 2001
    • 0 Attachment
      Hi, Chris!

      --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
      > Is it reasonable to provide a procedure that can handle arguments
      > supplied either by name and by position?
      Truly only you can decide. How it happens usually: you write server
      and advertise methods and parameters, so everybody can use it. If
      your parameters have names, client should specify it in request. But,
      you can also ALLOW them to have a choice:
      1. You can call this method with NAMED parameters in ANY order or
      2. You can call this method with ORDERED parameters in SPECIFIED order

      Then all that you need to do is check for presence of NAMED
      parameters and if there is no single one (with names you're looking
      for), get them by-order. In my understanding you have three choices:
      by-order, by-name and by-name-or-by-order. You did it right, but I
      think it should be included in the library, so you don't need to
      duplicate this code in your methods. Does it answer your question?
      BTW, there is no consensus on soapbuilders list on should by-order
      parameters be allowed or not. I personally think they should, but I
      represent minority in this aspect :).

      Best wishes, Paul.

      P.S. as far as I understand there is no need to check for
      mandatory/optional parameters in paramByName.

      >I can see one way of implementing this:
      >
      > package ByNameOrPos;
      >
      > use strict;
      > use vars qw(@ISA);
      > @ISA = qw(SOAP::Server::Parameters);
      >
      > sub ParamsTest
      > {
      > my $self = shift @_; # Class
      > my $envelope = pop @_; # Envelope
      > my $argshash = $envelope->method; # Args by name
      > my ($fruit, $vegetable, $meat) = @_; # Args by pos
      >
      > # Check to see whether args have been passed by name
      > my ($byName, $missing) = (0, 0);
      > foreach my $mandatory (qw(fruit vegetable meat)) {
      > $byName = 1 if exists $argshash->{$mandatory};
      > $missing = 1 if not exists $argshash->{$mandatory};
      > }
      > $missing = 0 unless $byName;
      >
      > warn "byName=$byName, missing=$missing: fruit=$fruit,
      > vegetable=$vegetable, meat=$meat; self=$self, envelope=$envelope,
      > argshash=$argshash";
      >
      > my $byName = join (", ", map { "$_ => $argshash->{$_}" } sort
      keys
      > %$argshash);
      > my $byPosn = join (", ", @_);
      >
      > return "Given ($byName) by name and ($byPosn) by position." .
      > ' Args ' . ($byName ? 'passed by name' : 'probably passed by
      > position') . '.' .
      > ($missing ? ' Some mandatory parameters are missing.' : '');
      > }
      >
      > Is there a more reliable or more elegant technique that I can use
      instead of
      > this? For starters, my proposed solution breaks if there are no
      mandatory
      > parameters against which to check.
      >
      > For completeness, here's how I call this from SOAPsh.pl:
      >
      > > ParamsTest('apple', 'spinach', 'chicken')
      > --- SOAP RESULT ---
      > 'Given (c-gensym215 => apple, c-gensym217 => spinach, c-gensym219 =>
      > chicken) by name and (apple, spinach, chicken) by position. Args
      passed by
      > name.'
      >
      > >
      > ParamsTest(SOAP::Data->name(meat=>'beef'),SOAP::Data->name
      (fruit=>'apricot')
      > ,SOAP::Data->name(vegetable=>'carrot'))
      > --- SOAP RESULT ---
      > 'Given (fruit => apricot, meat => beef, vegetable => carrot) by
      name and
      > (beef, apricot, carrot) by position. Args passed by name.'
      >
      > >
      > ParamsTest(SOAP::Data->name(meat=>'beef'),SOAP::Data->name
      (fruit=>'apricot')
      > )
      > --- SOAP RESULT ---
      > 'Given (fruit => apricot, meat => beef) by name and (beef, apricot)
      by
      > position. Args passed by name. Some mandatory parameters are
      missing.'
      >
      > I also would expect to have to massage the provided parameter names
      if
      > something like MS .NET were to call this procedure with arguments
      by name,
      > but in the interests of simplicity I'm ignoring that for now.
      >
      > Thanks,
      > Chris
    • One4K4
      Maybe an option would be to have little wrapper subroutines: sub byposGetAcctNumber { my $self = shift; my ($name,$ss) = @_;
      Message 2 of 26 , Jun 13, 2002
      • 0 Attachment
        Maybe an option would be to have little "wrapper" subroutines:

        sub byposGetAcctNumber {
        my $self = shift;
        my ($name,$ss) = @_;
        GetAcctNumber(name=>$name,ss=>$ss);
        }

        sub bynameGetAcctNumber {
        my $self = shift;
        my $args = (@_);
        GetAcctNumber(name=>$args{name},ss=>$args{ss});
        }

        ? Just my $0.02;

        -Tom

        --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
        > Actually that quote was from me, but no matter. Thanks for the
        update
        >
        > Regards,
        > Chris
        >
        > -----Original Message-----
        > From: Paul Kulchenko [mailto:paulclinger@y...]
        > Sent: Monday, May 14, 2001 4:24 PM
        > To: soaplite@y...
        > Subject: Re: [soaplite] Re: Can the server process parameters by
        name?
        >
        > Hi, Ashley!
        >
        > > > The only way I can see of solving this is to look for the
        > > mandatory
        > > > parameter names, and if you find any of them then assume the
        > > > parameters have been passed by name. Ugh!
      • Keanan Smith
        Err shouldn t that be: sub bynameGetAcctNumber { my $self = shift; my %args = (@_); GetAcctNumber(name= $args{name},ss= $args{ss}); } (Note the % on the 1st
        Message 3 of 26 , Jun 13, 2002
        • 0 Attachment
          Err shouldn't that be:

          sub bynameGetAcctNumber {
          my $self = shift;
          my %args = (@_);
          GetAcctNumber(name=>$args{name},ss=>$args{ss});
          }

          (Note the % on the 1st args)
          ??
          -----Original Message-----
          From: One4K4 [mailto:one4k4@...]
          Sent: Thursday, June 13, 2002 8:23 AM
          To: soaplite@yahoogroups.com
          Subject: [soaplite] Re: Can the server process parameters by name?


          Maybe an option would be to have little "wrapper" subroutines:

          sub byposGetAcctNumber {
          my $self = shift;
          my ($name,$ss) = @_;
          GetAcctNumber(name=>$name,ss=>$ss);
          }

          sub bynameGetAcctNumber {
          my $self = shift;
          my $args = (@_);
          GetAcctNumber(name=>$args{name},ss=>$args{ss});
          }

          ? Just my $0.02;

          -Tom

          --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
          > Actually that quote was from me, but no matter. Thanks for the
          update
          >
          > Regards,
          > Chris
          >
          > -----Original Message-----
          > From: Paul Kulchenko [mailto:paulclinger@y...]
          > Sent: Monday, May 14, 2001 4:24 PM
          > To: soaplite@y...
          > Subject: Re: [soaplite] Re: Can the server process parameters by
          name?
          >
          > Hi, Ashley!
          >
          > > > The only way I can see of solving this is to look for the
          > > mandatory
          > > > parameter names, and if you find any of them then assume the
          > > > parameters have been passed by name. Ugh!



          To unsubscribe from this group, send an email to:
          soaplite-unsubscribe@yahoogroups.com



          Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
        • One4K4
          Yes, yes it should. I m left handed. ;) ... http://docs.yahoo.com/info/terms/
          Message 4 of 26 , Jun 13, 2002
          • 0 Attachment
            Yes, yes it should. I'm left handed. ;)

            --- In soaplite@y..., Keanan Smith <KSmith@n...> wrote:
            > Err shouldn't that be:
            >
            > sub bynameGetAcctNumber {
            > my $self = shift;
            > my %args = (@_);
            > GetAcctNumber(name=>$args{name},ss=>$args{ss});
            > }
            >
            > (Note the % on the 1st args)
            > ??
            > -----Original Message-----
            > From: One4K4 [mailto:one4k4@y...]
            > Sent: Thursday, June 13, 2002 8:23 AM
            > To: soaplite@y...
            > Subject: [soaplite] Re: Can the server process parameters by name?
            >
            >
            > Maybe an option would be to have little "wrapper" subroutines:
            >
            > sub byposGetAcctNumber {
            > my $self = shift;
            > my ($name,$ss) = @_;
            > GetAcctNumber(name=>$name,ss=>$ss);
            > }
            >
            > sub bynameGetAcctNumber {
            > my $self = shift;
            > my $args = (@_);
            > GetAcctNumber(name=>$args{name},ss=>$args{ss});
            > }
            >
            > ? Just my $0.02;
            >
            > -Tom
            >
            > --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
            > > Actually that quote was from me, but no matter. Thanks for the
            > update
            > >
            > > Regards,
            > > Chris
            > >
            > > -----Original Message-----
            > > From: Paul Kulchenko [mailto:paulclinger@y...]
            > > Sent: Monday, May 14, 2001 4:24 PM
            > > To: soaplite@y...
            > > Subject: Re: [soaplite] Re: Can the server process parameters by
            > name?
            > >
            > > Hi, Ashley!
            > >
            > > > > The only way I can see of solving this is to look for the
            > > > mandatory
            > > > > parameter names, and if you find any of them then assume the
            > > > > parameters have been passed by name. Ugh!
            >
            >
            >
            > To unsubscribe from this group, send an email to:
            > soaplite-unsubscribe@y...
            >
            >
            >
            > Your use of Yahoo! Groups is subject to
            http://docs.yahoo.com/info/terms/
          • One4K4
            ... Every method on server side will be called as class/object method, so it will get an object reference or a class name as the first parameter, then the
            Message 5 of 26 , Jun 13, 2002
            • 0 Attachment
              From the SOAP::Lite pod docs:
              ------------------------------------------------------
              Every method on server side will be called as class/object method, so
              it will get an object reference or a class name as the first
              parameter, then the method parameters, and then an envelope as
              SOAP::SOM object. Shortly:

              $self [, @parameters] , $envelope

              If you have a fixed number of parameters, you can do:

              my $self = shift;
              my($param1, $param2) = @_;

              and ignore the envelope. If you need access to the envelope you can
              do:

              my $envelope = pop;

              since the envelope is always the last element in the parameters list.
              The byname() method pop->method will return a hash with parameter
              names as hash keys and parameter values as hash values:

              my($a, $b, $c) = @{pop->method}{qw(a b c)};

              gives you by-name access to your parameters.
              ------------------------------------------------------

              my($a, $b, $c) = @{pop->method}{qw(a b c)};
              I've tried that... but for some reason there is *no envelope* at the
              end of @_ ?!

              -Tom


              --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
              > I'm using a SOAP::Lite server with version 0.46 of SOAP::Lite.
              >
              > My colleagues in a.n.other company want to use named parameters
              (rather than
              > positional ones) to talk to my SOAP::Lite server. They are using
              MS .NET,
              > and we're around most of the interoperability issues now. Is it
              easy for a
              > SOAP::Lite server to handle named parameters, and if so how do I
              approach
              > the problem?
              >
              > Thanks,
              > Chris
              > --
              > Chris Davies, Manheim Interactive (Europe)
              > Tel. 0870 444-0450 Fax. 0870 444-0482 Email. MOL@M...
            • One4K4
              FYI: You need: package Foo; @Foo::ISA = SOAP::Server::Parameters ; At the top of your package declration. *If* you re dynamically/non- statically
              Message 6 of 26 , Jun 13, 2002
              • 0 Attachment
                FYI: You need:

                package Foo;
                @Foo::ISA = 'SOAP::Server::Parameters';

                At the top of your package declration. *If* you're dynamically/non-
                statically dispatching.

                -Tom

                --- In soaplite@y..., "One4K4" <one4k4@y...> wrote:
                > From the SOAP::Lite pod docs:
                > ------------------------------------------------------
                > Every method on server side will be called as class/object method,
                so
                > it will get an object reference or a class name as the first
                > parameter, then the method parameters, and then an envelope as
                > SOAP::SOM object. Shortly:
                >
                > $self [, @parameters] , $envelope
                >
                > If you have a fixed number of parameters, you can do:
                >
                > my $self = shift;
                > my($param1, $param2) = @_;
                >
                > and ignore the envelope. If you need access to the envelope you can
                > do:
                >
                > my $envelope = pop;
                >
                > since the envelope is always the last element in the parameters
                list.
                > The byname() method pop->method will return a hash with parameter
                > names as hash keys and parameter values as hash values:
                >
                > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                >
                > gives you by-name access to your parameters.
                > ------------------------------------------------------
                >
                > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                > I've tried that... but for some reason there is *no envelope* at
                the
                > end of @_ ?!
                >
                > -Tom
                >
                >
                > --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
                > > I'm using a SOAP::Lite server with version 0.46 of SOAP::Lite.
                > >
                > > My colleagues in a.n.other company want to use named parameters
                > (rather than
                > > positional ones) to talk to my SOAP::Lite server. They are using
                > MS .NET,
                > > and we're around most of the interoperability issues now. Is it
                > easy for a
                > > SOAP::Lite server to handle named parameters, and if so how do I
                > approach
                > > the problem?
                > >
                > > Thanks,
                > > Chris
                > > --
                > > Chris Davies, Manheim Interactive (Europe)
                > > Tel. 0870 444-0450 Fax. 0870 444-0482 Email. MOL@M...
              • Keanan Smith
                You will get this functionality ONLY if you inherit your class from the SOAP::Server::Parameters class. This should keep existing code working and provides
                Message 7 of 26 , Jun 13, 2002
                • 0 Attachment
                  "You will get this functionality ONLY if you inherit your class from the
                  SOAP::Server::Parameters class. This should keep existing code working and
                  provides this feature only when you need it."

                  I think this may be what you are looking for...

                  -----Original Message-----
                  From: One4K4 [mailto:one4k4@...]
                  Sent: Thursday, June 13, 2002 8:51 AM
                  To: soaplite@yahoogroups.com
                  Subject: [soaplite] Re: Can the server process parameters by name?


                  From the SOAP::Lite pod docs:
                  ------------------------------------------------------
                  Every method on server side will be called as class/object method, so
                  it will get an object reference or a class name as the first
                  parameter, then the method parameters, and then an envelope as
                  SOAP::SOM object. Shortly:

                  $self [, @parameters] , $envelope

                  If you have a fixed number of parameters, you can do:

                  my $self = shift;
                  my($param1, $param2) = @_;

                  and ignore the envelope. If you need access to the envelope you can
                  do:

                  my $envelope = pop;

                  since the envelope is always the last element in the parameters list.
                  The byname() method pop->method will return a hash with parameter
                  names as hash keys and parameter values as hash values:

                  my($a, $b, $c) = @{pop->method}{qw(a b c)};

                  gives you by-name access to your parameters.
                  ------------------------------------------------------

                  my($a, $b, $c) = @{pop->method}{qw(a b c)};
                  I've tried that... but for some reason there is *no envelope* at the
                  end of @_ ?!

                  -Tom


                  --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
                  > I'm using a SOAP::Lite server with version 0.46 of SOAP::Lite.
                  >
                  > My colleagues in a.n.other company want to use named parameters
                  (rather than
                  > positional ones) to talk to my SOAP::Lite server. They are using
                  MS .NET,
                  > and we're around most of the interoperability issues now. Is it
                  easy for a
                  > SOAP::Lite server to handle named parameters, and if so how do I
                  approach
                  > the problem?
                  >
                  > Thanks,
                  > Chris
                  > --
                  > Chris Davies, Manheim Interactive (Europe)
                  > Tel. 0870 444-0450 Fax. 0870 444-0482 Email. MOL@M...



                  To unsubscribe from this group, send an email to:
                  soaplite-unsubscribe@yahoogroups.com



                  Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
                • One4K4
                  Yeap, that did it... consider: package DocPub; @DocPub::ISA = SOAP::Server::Parameters ; Which solved my problem, using the pod doc s code sample. Thanks!
                  Message 8 of 26 , Jun 13, 2002
                  • 0 Attachment
                    Yeap, that did it... consider:

                    package DocPub;
                    @DocPub::ISA = 'SOAP::Server::Parameters';

                    Which solved my problem, using the pod doc's code sample.

                    Thanks!

                    -Tom

                    --- In soaplite@y..., Keanan Smith <KSmith@n...> wrote:
                    > "You will get this functionality ONLY if you inherit your class
                    from the
                    > SOAP::Server::Parameters class. This should keep existing code
                    working and
                    > provides this feature only when you need it."
                    >
                    > I think this may be what you are looking for...
                    >
                    > -----Original Message-----
                    > From: One4K4 [mailto:one4k4@y...]
                    > Sent: Thursday, June 13, 2002 8:51 AM
                    > To: soaplite@y...
                    > Subject: [soaplite] Re: Can the server process parameters by name?
                    >
                    >
                    > From the SOAP::Lite pod docs:
                    > ------------------------------------------------------
                    > Every method on server side will be called as class/object method,
                    so
                    > it will get an object reference or a class name as the first
                    > parameter, then the method parameters, and then an envelope as
                    > SOAP::SOM object. Shortly:
                    >
                    > $self [, @parameters] , $envelope
                    >
                    > If you have a fixed number of parameters, you can do:
                    >
                    > my $self = shift;
                    > my($param1, $param2) = @_;
                    >
                    > and ignore the envelope. If you need access to the envelope you can
                    > do:
                    >
                    > my $envelope = pop;
                    >
                    > since the envelope is always the last element in the parameters
                    list.
                    > The byname() method pop->method will return a hash with parameter
                    > names as hash keys and parameter values as hash values:
                    >
                    > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                    >
                    > gives you by-name access to your parameters.
                    > ------------------------------------------------------
                    >
                    > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                    > I've tried that... but for some reason there is *no envelope* at
                    the
                    > end of @_ ?!
                    >
                    > -Tom
                    >
                    >
                    > --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
                    > > I'm using a SOAP::Lite server with version 0.46 of SOAP::Lite.
                    > >
                    > > My colleagues in a.n.other company want to use named parameters
                    > (rather than
                    > > positional ones) to talk to my SOAP::Lite server. They are using
                    > MS .NET,
                    > > and we're around most of the interoperability issues now. Is it
                    > easy for a
                    > > SOAP::Lite server to handle named parameters, and if so how do I
                    > approach
                    > > the problem?
                    > >
                    > > Thanks,
                    > > Chris
                    > > --
                    > > Chris Davies, Manheim Interactive (Europe)
                    > > Tel. 0870 444-0450 Fax. 0870 444-0482 Email. MOL@M...
                    >
                    >
                    >
                    > To unsubscribe from this group, send an email to:
                    > soaplite-unsubscribe@y...
                    >
                    >
                    >
                    > Your use of Yahoo! Groups is subject to
                    http://docs.yahoo.com/info/terms/
                  • Paul Kulchenko
                    Hi, Tom! There are also byName and byNameOrOrder functions (Randy Ray made a great suggestion to make them methods instead of functions) in
                    Message 9 of 26 , Jun 13, 2002
                    • 0 Attachment
                      Hi, Tom!

                      There are also byName and byNameOrOrder functions (Randy Ray made a
                      great suggestion to make them methods instead of functions) in
                      SOAP::Server::Parameters class that allow you to do this:

                      my $self = shift;
                      my($a, $b, $c) = SOAP::Server::Parameters::byName([qw(a b c)], @_);

                      Take a look at \examples\My\Parameters.pm for more details.

                      Best wishes, Paul.

                      --- One4K4 <one4k4@...> wrote:
                      > Yeap, that did it... consider:
                      >
                      > package DocPub;
                      > @DocPub::ISA = 'SOAP::Server::Parameters';
                      >
                      > Which solved my problem, using the pod doc's code sample.
                      >
                      > Thanks!
                      >
                      > -Tom
                      >
                      > --- In soaplite@y..., Keanan Smith <KSmith@n...> wrote:
                      > > "You will get this functionality ONLY if you inherit your class
                      > from the
                      > > SOAP::Server::Parameters class. This should keep existing code
                      > working and
                      > > provides this feature only when you need it."
                      > >
                      > > I think this may be what you are looking for...
                      > >
                      > > -----Original Message-----
                      > > From: One4K4 [mailto:one4k4@y...]
                      > > Sent: Thursday, June 13, 2002 8:51 AM
                      > > To: soaplite@y...
                      > > Subject: [soaplite] Re: Can the server process parameters by
                      > name?
                      > >
                      > >
                      > > From the SOAP::Lite pod docs:
                      > > ------------------------------------------------------
                      > > Every method on server side will be called as class/object
                      > method,
                      > so
                      > > it will get an object reference or a class name as the first
                      > > parameter, then the method parameters, and then an envelope as
                      > > SOAP::SOM object. Shortly:
                      > >
                      > > $self [, @parameters] , $envelope
                      > >
                      > > If you have a fixed number of parameters, you can do:
                      > >
                      > > my $self = shift;
                      > > my($param1, $param2) = @_;
                      > >
                      > > and ignore the envelope. If you need access to the envelope you
                      > can
                      > > do:
                      > >
                      > > my $envelope = pop;
                      > >
                      > > since the envelope is always the last element in the parameters
                      > list.
                      > > The byname() method pop->method will return a hash with parameter
                      >
                      > > names as hash keys and parameter values as hash values:
                      > >
                      > > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                      > >
                      > > gives you by-name access to your parameters.
                      > > ------------------------------------------------------
                      > >
                      > > my($a, $b, $c) = @{pop->method}{qw(a b c)};
                      > > I've tried that... but for some reason there is *no envelope* at
                      > the
                      > > end of @_ ?!
                      > >
                      > > -Tom
                      > >
                      > >
                      > > --- In soaplite@y..., "Chris Davies" <Chris.Davies@M...> wrote:
                      > > > I'm using a SOAP::Lite server with version 0.46 of SOAP::Lite.
                      > > >
                      > > > My colleagues in a.n.other company want to use named parameters
                      >
                      > > (rather than
                      > > > positional ones) to talk to my SOAP::Lite server. They are
                      > using
                      > > MS .NET,
                      > > > and we're around most of the interoperability issues now. Is it
                      >
                      > > easy for a
                      > > > SOAP::Lite server to handle named parameters, and if so how do
                      > I
                      > > approach
                      > > > the problem?
                      > > >
                      > > > Thanks,
                      > > > Chris
                      > > > --
                      > > > Chris Davies, Manheim Interactive (Europe)
                      > > > Tel. 0870 444-0450 Fax. 0870 444-0482 Email. MOL@M...
                      > >
                      > >
                      > >
                      > > To unsubscribe from this group, send an email to:
                      > > soaplite-unsubscribe@y...
                      > >
                      > >
                      > >
                      > > Your use of Yahoo! Groups is subject to
                      > http://docs.yahoo.com/info/terms/
                      >
                      >
                      > ------------------------ Yahoo! Groups Sponsor
                      >
                      > To unsubscribe from this group, send an email to:
                      > soaplite-unsubscribe@yahoogroups.com
                      >
                      >
                      >
                      > Your use of Yahoo! Groups is subject to
                      > http://docs.yahoo.com/info/terms/
                      >
                      >


                      __________________________________________________
                      Do You Yahoo!?
                      Yahoo! - Official partner of 2002 FIFA World Cup
                      http://fifaworldcup.yahoo.com
                    Your message has been successfully submitted and would be delivered to recipients shortly.