• Home
  • History
  • Annotate
  • only in this directory
NameDateSize

..11-Apr-2013244

ChangesH A D20-Feb-20132.2 KiB

dist.iniH A D20-Feb-2013496

lib/H05-Apr-20133

Makefile.PLH A D20-Feb-20131.1 KiB

MANIFESTH A D20-Feb-2013865

META.ymlH A D20-Feb-2013596

READMEH A D20-Feb-201312.5 KiB

t/H11-Apr-201324

README

1NAME
2    Pod::WSDL - Creates WSDL documents from (extended) pod
3
4INSTALLATION
5
6To install this module type the following:
7
8   perl Makefile.PL
9   make
10   make test
11   make install
12
13SYNOPSIS
14      use Pod::WSDL;
15
16      my $pod = new Pod::WSDL(source => 'My::Server', 
17        location => 'http://localhost/My/Server',
18        pretty => 1,
19        withDocumentation => 1);
20
21      print $pod->WSDL;
22
23DESCRIPTION - How to use Pod::WSDL
24  Parsing the pod
25    How does Pod::WSDL work? If you instantiate a Pod::WSDL object with the
26    name of the module (or the path of the file, or an open filehandle)
27    providing the web service like this
28
29      my $pwsdl = new Pod::WSDL(source => 'My::Module', 
30            location => 'http://my.services.location/on/the/web');
31
32    Pod::WSDL will try to find "My::Module" in @INC, open the file, parse it
33    for WSDL directives and prepare the information for WSDL output. By
34    calling
35
36      $pwsdl->WSDL;
37
38    Pod::WSDL will output the WSDL document. That's it.
39
40    When using Pod::WSDL, the parser expects you to do the following:
41
42    * Put the pod directly above the subroutines which the web service's
43      client is going to call. There may be whitespace between the pod and
44      the sub declaration but nothing else.
45
46    * Use the "=begin"/"=end" respectively the "=for" directives according
47      to standard pod: anything between "=begin WSDL" and "=end" will be
48      treated as pod. Anything composing a paragraph together with "=for
49      WSDL" will be treated as pod.
50
51    Any subroutine not preceeded by WSDL pod will be left unmentioned. Any
52    standard pod will be ignored (though, for an exception to this, see the
53    section on own complex types below).
54
55    The individual instructions for Pod::WSDL always begin with a keyword,
56    like "_RETURN" or "_DOC" or "_FAULT". After this different things may
57    follow, according to the specific type of instruction. The instruction
58    may take one or more lines - everything up to the next line beginning
59    with a keyword or the end of the pod is belonging to the current
60    instruction.
61
62  Describing Methods
63    How do we use Pod::WSDL? In describing a web service's method we have to
64    say something about parameters, return values and faults. In addition
65    you might want to add some documentation to these items and to the
66    method itself.
67
68   Parameters
69    WSDL differentiates between in-, out- and inout-parameters, so we do
70    that, too. A different matter is the question, if the client can do this
71    too, but now we are talking about possibilities, not actualities.
72
73    The pod string describing a parameter has the structure
74
75      (_IN|_OUT|_INOUT) NAME ($|@)TYPE DESCRIPTION
76
77    like
78
79      _IN foo $string This is a foo
80
81    or
82
83      _INOUT bar @bar An array of bars
84
85    You will easily guess what "_IN", "_OUT" and "_INOUT" stand for so we
86    can move on. "NAME" is the name of your parameter. It does not have any
87    real function (the order of the parameters being the only important
88    thing) but it is nice to have it since in a WSDL document the parameters
89    need to have names. So instead of having Pod::WSDL automatically
90    generate cryptic names (it cannot do that right now) be nice to the
91    client and use some sensible name. The "TYPE" of the parameters can be
92    any of the xsd (schema) standard types (see [5]) or a type of your own
93    creation. The "$" resp. "@" symbols tell Pod::WSDL and your client if it
94    is a scalar or array parameter. Everything following the type up to the
95    next instruction is treated as the parameter's documentation. If you
96    call the constructor of Pod::WSDL with the argument "withDocumentation
97    => 1", it will be added to the WSDL.
98
99   Return Values
100    Return values work like parameters but since in WSDL there is provision
101    for only one return value (you have (in)out parameters, or can return
102    arrays if that isn't enough), you do not need to give them a name.
103    Pod::WSDL will automatically call them 'Return' in the WSDL document.
104    So, the structure of "_RETURN" instructions is
105
106      _RETURN ($|@)TYPE DESCRIPTION
107
108    as in
109
110      _RETURN $string Returns a string
111
112    The pod for one method may only have one "_RETURN" instruction. If you
113    don't specify a "_RETURN" instruction, Pod::WSDL will assume that you
114    return void. Of course the perl subroutine still will return something,
115    but your web service won't. To make this clear Pod::WSDL generates an
116    empty response message for this.
117
118    If you want some method to be a one way operation (see [4], ch. 2.4.1),
119    say so by using the instruction "_ONEWAY" in the pod. In this case no
120    response message will be generated and a "_RETURN" instruction will be
121    ignored.
122
123   Faults
124    SOAP faults are usually translated into exceptions in languages like
125    Java. If you set up a web service using SOAP::Lite, SOAP will trap your
126    dying program and generate a generic fault using the message of "die".
127    It is also possible to access SOAP::Lite's SOAP::Fault directly if you
128    want more control - but this is not our issue. If you want to use
129    custom-made fault messages of your own, define them in "_FAULT"
130    instructions, which look like this:
131
132      _FAULT TYPE DESCRIPTION
133
134    An example could be the following:
135
136      _FAULT My::Fault If anything goes wrong
137
138    Since you probably won't return an array of fault objects, you do not
139    need to use the "($|@)" tokens. Just say that you return a fault,
140    declare it's type and add an optional description.
141
142    As with parameters (but in contrary to "_RETURN" instructions) you can
143    declare as many "_FAULT" instructions as you like, providing for
144    different exception types your method might throw.
145
146   Method Documentation
147    Method documentation is easily explained. It's structure is
148
149      _DOC Here comes my documentation ...
150
151    That's it. Use several lines of documentation if you like. If you
152    instantiate the Pod::WSDL object with the parameter "withDocumentation
153    => 1", it will be written into the WSDL document.
154
155  Describing Modules - Using Own Complex Types
156    Quite often it will be the case that you have to use complex types as
157    parameters or return values. One example of this we saw when talking
158    about faults: you might want to create custom fault types (exceptions)
159    of your own to fullfill special needs in the communication between web
160    service and client. But of course you also might simply want to pass a
161    complex parameter like a address object containing customer data to your
162    application. WSDL provides the means to describe complex types borrowing
163    the xsd schema syntax. Pod::WSDL makes use of this by allowing you to
164    add WSDL pod to your own types. Assuming you have some own type like
165
166      package My::Type;
167
168      sub new {
169        bless {
170          foo => 'foo',
171          bar => -1
172        }, $_[0];
173      }
174
175      1;
176
177    simply describe the keys of your blessed hash like this.
178
179      =begin WSDL
180
181        _ATTR foo $string A foo
182        _ATTR bar $integer And a bar
183
184      =end WSDL
185
186    Put this pod anywhere within the package My::Type. Pod::WSDL will find
187    it (if it is in @INC), parse it and integrate it into the WSDL document.
188    The "_ATTR" instruction works exactly as the "_IN", "_OUT" and "_INOUT"
189    instructions for methods (see above).
190
191    If you initialize the Pod::WSDL object using "withDocumentation => 1",
192    Pod::WSDL will look for standard pod in the module, parse it using
193    Pod::Text and put it into the WSDL document.
194
195METHODS
196  new
197    Instantiates a new Pod::WSDL.
198
199   Parameters
200    *   source - Name of the source file, package of the source module or
201        file handle on source file for which the WSDL shall be generated.
202        This source must contain specialized Pod tags. So, if your source is
203        '/some/directory/modules/Foo/Bar.pm' with package declaration
204        'Foo::Bar', source may be '/some/directory/modules/Foo/Bar.pm' or
205        'Foo::Bar' (in which case '/some/directory/modules' has to be in
206        @INC) or an open file handle on the file. Right?
207
208    *   location - Target namespace for the WSDL, usually the full URL of
209        your webservice's proxy.
210
211    *   pretty - Pretty print WSDL, if true. Otherwise the WSDL will come
212        out in one line. The software generating the client stubs might not
213        mind, but a person reading the WSDL will!
214
215    *   withDocumentation - If true, put available documentation in the WSDL
216        (see "Pod Syntax" above). For used own complex types ('modules')
217        this will be the output of Pod::Text on these modules. The software
218        generating the client stubs might give a damn, but a person reading
219        the WSDL won't!
220
221  WSDL
222    Returns WSDL as string.
223
224   Parameters
225    *   pretty - Pretty print WSDL, if true. Otherwise the WSDL will come
226        out in one line. The software generating the client stubs might not
227        mind, but a person reading the WSDL will!
228
229    *   withDocumentation - If true, put available documentation in the WSDL
230        (see "Pod Syntax" above). For used own complex types ('modules')
231        this will be the output of Pod::Text on these modules. The software
232        generating the client stubs might give a damn, but a person reading
233        the WSDL won't!
234
235  addNamespace
236    Adds a namespace. Will be taken up in WSDL's definitions element.
237
238   Parameters
239    1   URI of the namespace
240
241    2   Declarator of the namespace
242
243EXTERNAL DEPENDENCIES
244      Carp
245      XML::Writer
246      IO::Scalar
247      Pod::Text
248  
249    The test scripts use
250
251      XML::XPath
252
253EXAMPLES
254    see the *.t files in the distribution
255
256BUGS
257    Please send me any bug reports, I will fix them or mention the bugs here
258    :-)
259
260TODO
261  Describe Several Signatures for one Method
262    Of course, one subroutine declaration might take a lot of different sets
263    of parameters. In Java or C++ you would have to have several methods
264    with different signatures. In perl you fix this within the method. So
265    why not put several WSDL pod blocks above the method so the web
266    service's client can handle that.
267
268  Implement a Better Parsing of the pod
269    Right know, the pod is found using some rather complex regular
270    expressions. This is evil and will certainly fail in some situations.
271    So, an issue on top of the fixme list is to switch to regular parsing.
272    I'm not sure if I can use Pod::Parser since I need the sub declaration
273    outside the pod, too.
274
275  Handle Several Package Declarations in One File
276    So far, Pod::WSDL assumes a one to one relation between packages and
277    files. If it meets several package declarations in one file, it will
278    fail some way or the other. For most uses, one package in one file will
279    presumably suffice, but it would be nice to be able to handle the other
280    cases, too.
281
282  Handle Array based blessed References
283    Array based blessed references used for complex types are something of a
284    problem.
285
286  Get Information on Complex Types from Somewhere Else
287    If you use complex types for parameters that are not your own (we
288    assume, that the module containing the web service always is your own),
289    you might not be able to put the WSDL pod into the module files. So why
290    not fetch it from somewhere else like a configuration file?
291
292  Integrate Pod::WSDL with SOAP::Lite
293    With Axis, you simply call the web service's URL with the parameter
294    '?wsdl' and you get the WSDL document. It would be nice to be able to do
295    this with SOAP::Lite, too.
296
297  Implement Non RPC Style Messages
298    Pod::WSDL writes WSDL documents in encoded RPC style. It should be able
299    to generate literal RPC and document styles, too.
300
301REFERENCES
302    [1] <http://ws.apache.org/axis/>
303
304    [2] <http://search.cpan.org/~kbrown/SOAP-0.28/>
305
306    [3] <http://search.cpan.org/~byrne/SOAP-Lite-0.65_5/>
307
308    [4] <http://www.w3.org/TR/wsdl.html>
309
310    [5] <http://www.w3.org/TR/xmlschema-2/>
311
312SEE ALSO
313      http://ws.apache.org/axis/
314      http://search.cpan.org/~kbrown/SOAP-0.28/
315      http://search.cpan.org/~byrne/SOAP-Lite-0.65_5/
316      http://www.w3.org/TR/wsdl
317  
318      WSDL::Generator (a different way to do it)
319      SOAP::WSDL (the client side)
320      SOAP::Clean::WSDL (I have not tried this)
321 
322AUTHOR
323    Tarek Ahmed, <bloerch -the character every email address contains-
324    oelbsk.org>
325
326COPYRIGHT AND LICENSE
327    Copyright (C) 2010 by Tarek Ahmed
328
329    This library is alpha software and comes with no warranty whatsoever. It
330    is free software; you can redistribute it and/or modify it under the
331    same terms as Perl itself, either Perl version 5.8.5 or, at your option,
332    any later version of Perl 5 you may have available.
333
334