File: README

package info (click to toggle)
libsoap-lite-perl 1.27-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 1,680 kB
  • sloc: perl: 8,908; makefile: 23; cs: 16
file content (1683 lines) | stat: -rw-r--r-- 62,608 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
NAME
    SOAP::Lite - Perl's Web Services Toolkit

DESCRIPTION
    SOAP::Lite is a collection of Perl modules which provides a simple and
    lightweight interface to the Simple Object Access Protocol (SOAP) both
    on client and server side.

PERL VERSION WARNING
    As of version SOAP::Lite version 1.0, no perl versions before 5.8 will
    be supported.

    SOAP::Lite 0.71 will be the last version of SOAP::Lite running on perl
    5.005

    Future versions of SOAP::Lite will require at least perl 5.6.0

    If you have not had the time to upgrade your perl, you should consider
    this now.

OVERVIEW OF CLASSES AND PACKAGES
    lib/SOAP/Lite.pm
        SOAP::Lite - Main class provides all logic

        SOAP::Transport - Transport backend

        SOAP::Data - Data objects

        SOAP::Header - Header Data Objects

        SOAP::Serializer - Serializes data structures to SOAP messages

        SOAP::Deserializer - Deserializes SOAP messages into SOAP::SOM
        objects

        SOAP::SOM - SOAP Message objects

        SOAP::Constants - Provides access to common constants and defaults

        SOAP::Trace - Tracing facilities

        SOAP::Schema - Provides access and stub(s) for schema(s)

        SOAP::Schema::WSDL - WSDL implementation for SOAP::Schema

        SOAP::Server - Handles requests on server side

        SOAP::Server::Object - Handles objects-by-reference

        SOAP::Fault - Provides support for Faults on server side

        SOAP::Utils - A set of private and public utility subroutines

    lib/SOAP/Packager.pm
        SOAP::Packager - Provides an abstract class for implementing custom
        packagers.

        SOAP::Packager::MIME - Provides MIME support to SOAP::Lite

        SOAP::Packager::DIME - Provides DIME support to SOAP::Lite

    lib/SOAP/Transport/HTTP.pm
        SOAP::Transport::HTTP::Client - Client interface to HTTP transport

        SOAP::Transport::HTTP::Server - Server interface to HTTP transport

        SOAP::Transport::HTTP::CGI - CGI implementation of server interface

        SOAP::Transport::HTTP::Daemon - Daemon implementation of server
        interface

        SOAP::Transport::HTTP::Apache - mod_perl implementation of server
        interface

    lib/SOAP/Transport/POP3.pm
        SOAP::Transport::POP3::Server - Server interface to POP3 protocol

    lib/SOAP/Transport/MAILTO.pm
        SOAP::Transport::MAILTO::Client - Client interface to SMTP/sendmail

    lib/SOAP/Transport/LOCAL.pm
        SOAP::Transport::LOCAL::Client - Client interface to local transport

    lib/SOAP/Transport/TCP.pm
        SOAP::Transport::TCP::Server - Server interface to TCP protocol

        SOAP::Transport::TCP::Client - Client interface to TCP protocol

    lib/SOAP/Transport/IO.pm
        SOAP::Transport::IO::Server - Server interface to IO transport

METHODS
    All accessor methods return the current value when called with no
    arguments, while returning the object reference itself when called with
    a new value. This allows the set-attribute calls to be chained together.

    new(optional key/value pairs)
            $client = SOAP::Lite->new(proxy => $endpoint)

        Constructor. Many of the accessor methods defined here may be
        initialized at creation by providing their name as a key, followed
        by the desired value. The example provides the value for the proxy
        element of the client.

    transport(optional transport object)
            $transp = $client->transport( );

        Gets or sets the transport object used for sending/receiving SOAP
        messages.

        See SOAP::Transport for details.

    serializer(optional serializer object)
            $serial = $client->serializer( )

        Gets or sets the serializer object used for creating XML messages.

        See SOAP::Serializer for details.

    packager(optional packager object)
            $packager = $client->packager( )

        Provides access to the "SOAP::Packager" object that the client uses
        to manage the use of attachments. The default packager is a MIME
        packager, but unless you specify parts to send, no MIME formatting
        will be done.

        See also: SOAP::Packager.

    proxy(endpoint, optional extra arguments)
            $client->proxy('http://soap.xml.info/ endPoint');

        The proxy is the server or endpoint to which the client is going to
        connect. This method allows the setting of the endpoint, along with
        any extra information that the transport object may need when
        communicating the request.

        This method is actually an alias to the proxy method of
        SOAP::Transport. It is the same as typing:

            $client->transport( )->proxy(...arguments);

        Extra parameters can be passed to proxy() - see below.

        compress_threshold
            See COMPRESSION in HTTP::Transport.

        All initialization options from the underlying transport layer
            The options for HTTP(S) are the same as for LWP::UserAgent's
            new() method.

            A common option is to create a instance of HTTP::Cookies and
            pass it as cookie_jar option:

             my $cookie_jar = HTTP::Cookies->new()
             $client->proxy('http://www.example.org/webservice',
                cookie_jar => $cookie_jar,
             );

        For example, if you wish to set the HTTP timeout for a SOAP::Lite
        client to 5 seconds, use the following code:

          my $soap = SOAP::Lite
           ->uri($uri)
           ->proxy($proxyUrl, timeout => 5 );

        See LWP::UserAgent.

    endpoint(optional new endpoint address)
            $client->endpoint('http://soap.xml.info/ newPoint')

        It may be preferable to set a new endpoint without the additional
        work of examining the new address for protocol information and
        checking to ensure the support code is loaded and available. This
        method allows the caller to change the endpoint that the client is
        currently set to connect to, without reloading the relevant
        transport code. Note that the proxy method must have been called
        before this method is used.

    service(service URL)
            $client->service('http://svc.perl.org/Svc.wsdl');

        "SOAP::Lite" offers some support for creating method stubs from
        service descriptions. At present, only WSDL support is in place.
        This method loads the specified WSDL schema and uses it as the basis
        for generating stubs.

    outputxml(boolean)
            $client->outputxml('true');

        When set to a true value, the raw XML is returned by the call to a
        remote method.

        The default is to return the a SOAP::SOM object (false).

    autotype(boolean)
            $client->autotype(0);

        This method is a shortcut for:

            $client->serializer->autotype(boolean);

        By default, the serializer tries to automatically deduce types for
        the data being sent in a message. Setting a false value with this
        method disables the behavior.

    readable(boolean)
            $client->readable(1);

        This method is a shortcut for:

            $client->serializer->readable(boolean);

        When this is used to set a true value for this property, the
        generated XML sent to the endpoint has extra characters (spaces and
        new lines) added in to make the XML itself more readable to human
        eyes (presumably for debugging). The default is to not send any
        additional characters.

    default_ns($uri)
        Sets the default namespace for the request to the specified uri.
        This overrides any previous namespace declaration that may have been
        set using a previous call to "ns()" or "default_ns()". Setting the
        default namespace causes elements to be serialized without a
        namespace prefix, like this:

          <soap:Envelope>
            <soap:Body>
              <myMethod xmlns="http://www.someuri.com">
                <foo />
              </myMethod>
            </soap:Body>
          </soap:Envelope>

        Some .NET web services have been reported to require this XML
        namespace idiom.

    ns($uri,$prefix=undef)
        Sets the namespace uri and optionally the namespace prefix for the
        request to the specified values. This overrides any previous
        namespace declaration that may have been set using a previous call
        to "ns()" or "default_ns()".

        If a prefix is not specified, one will be generated for you
        automatically. Setting the namespace causes elements to be
        serialized with a declared namespace prefix, like this:

          <soap:Envelope>
            <soap:Body>
              <my:myMethod xmlns:my="http://www.someuri.com">
                <my:foo />
              </my:myMethod>
            </soap:Body>
          </soap:Envelope>

    use_prefix(boolean)
        Deprecated. Use the "ns()" and "default_ns" methods described above.

        Shortcut for "serializer->use_prefix()". This lets you turn on/off
        the use of a namespace prefix for the children of the /Envelope/Body
        element. Default is 'true'.

        When use_prefix is set to 'true', serialized XML will look like
        this:

          <SOAP-ENV:Envelope ...attributes skipped>
            <SOAP-ENV:Body>
              <namesp1:mymethod xmlns:namesp1="urn:MyURI" />
            </SOAP-ENV:Body>
          </SOAP-ENV:Envelope>

        When use_prefix is set to 'false', serialized XML will look like
        this:

          <SOAP-ENV:Envelope ...attributes skipped>
            <SOAP-ENV:Body>
              <mymethod xmlns="urn:MyURI" />
            </SOAP-ENV:Body>
          </SOAP-ENV:Envelope>

        Some .NET web services have been reported to require this XML
        namespace idiom.

    soapversion(optional value)
            $client->soapversion('1.2');

        If no parameter is given, returns the current version of SOAP that
        is being used by the client object to encode requests. If a
        parameter is given, the method attempts to set that as the version
        of SOAP being used.

        The value should be either 1.1 or 1.2.

    envprefix(QName)
            $client->envprefix('env');

        This method is a shortcut for:

            $client->serializer->envprefix(QName);

        Gets or sets the namespace prefix for the SOAP namespace. The
        default is SOAP.

        The prefix itself has no meaning, but applications may wish to chose
        one explicitly to denote different versions of SOAP or the like.

    encprefix(QName)
            $client->encprefix('enc');

        This method is a shortcut for:

            $client->serializer->encprefix(QName);

        Gets or sets the namespace prefix for the encoding rules namespace.
        The default value is SOAP-ENC.

    While it may seem to be an unnecessary operation to set a value that
    isn't relevant to the message, such as the namespace labels for the
    envelope and encoding URNs, the ability to set these labels explicitly
    can prove to be a great aid in distinguishing and debugging messages on
    the server side of operations.

    encoding(encoding URN)
            $client->encoding($soap_12_encoding_URN);

        This method is a shortcut for:

            $client->serializer->encoding(args);

        Where the earlier method dealt with the label used for the
        attributes related to the SOAP encoding scheme, this method actually
        sets the URN to be specified as the encoding scheme for the message.
        The default is to specify the encoding for SOAP 1.1, so this is
        handy for applications that need to encode according to SOAP 1.2
        rules.

    typelookup
            $client->typelookup;

        This method is a shortcut for:

            $client->serializer->typelookup;

        Gives the application access to the type-lookup table from the
        serializer object. See the section on SOAP::Serializer.

    uri(service specifier)
        Deprecated - the "uri" subroutine is deprecated in order to provide
        a more intuitive naming scheme for subroutines that set namespaces.
        In the future, you will be required to use either the "ns()" or
        "default_ns()" subroutines instead of "uri()".

            $client->uri($service_uri);

        This method is a shortcut for:

            $client->serializer->uri(service);

        The URI associated with this accessor on a client object is the
        service-specifier for the request, often encoded for HTTP-based
        requests as the SOAPAction header. While the names may seem
        confusing, this method doesn't specify the endpoint itself. In most
        circumstances, the "uri" refers to the namespace used for the
        request.

        Often times, the value may look like a valid URL. Despite this, it
        doesn't have to point to an existing resource (and often doesn't).
        This method sets and retrieves this value from the object. Note that
        no transport code is triggered by this because it has no direct
        effect on the transport of the object.

    multirefinplace(boolean)
            $client->multirefinplace(1);

        This method is a shortcut for:

            $client->serializer->multirefinplace(boolean);

        Controls how the serializer handles values that have multiple
        references to them. Recall from previous SOAP chapters that a value
        may be tagged with an identifier, then referred to in several
        places. When this is the case for a value, the serializer defaults
        to putting the data element towards the top of the message, right
        after the opening tag of the method-specification. It is serialized
        as a standalone entity with an ID that is then referenced at the
        relevant places later on. If this method is used to set a true
        value, the behavior is different. When the multirefinplace attribute
        is true, the data is serialized at the first place that references
        it, rather than as a separate element higher up in the body. This is
        more compact but may be harder to read or trace in a debugging
        environment.

    parts( ARRAY )
        Used to specify an array of MIME::Entity's to be attached to the
        transmitted SOAP message. Attachments that are returned in a
        response can be accessed by "SOAP::SOM::parts()".

    self
            $ref = SOAP::Lite->self;

        Returns an object reference to the default global object the
        "SOAP::Lite" package maintains. This is the object that processes
        many of the arguments when provided on the use line.

    The following method isn't an accessor style of method but neither does
    it fit with the group that immediately follows it:

    call(arguments)
            $client->call($method => @arguments);

        As has been illustrated in previous chapters, the "SOAP::Lite"
        client objects can manage remote calls with auto-dispatching using
        some of Perl's more elaborate features. call is used when the
        application wants a greater degree of control over the details of
        the call itself. The method may be built up from a SOAP::Data
        object, so as to allow full control over the namespace associated
        with the tag, as well as other attributes like encoding. This is
        also important for calling methods that contain characters not
        allowable in Perl function names, such as A.B.C.

    The next four methods used in the "SOAP::Lite" class are geared towards
    handling the types of events than can occur during the message
    lifecycle. Each of these sets up a callback for the event in question:

    on_action(callback)
            $client->on_action(sub { qq("$_[0]") });

        Triggered when the transport object sets up the SOAPAction header
        for an HTTP-based call. The default is to set the header to the
        string, uri#method, in which URI is the value set by the uri method
        described earlier, and method is the name of the method being
        called. When called, the routine referenced (or the closure, if
        specified as in the example) is given two arguments, uri and method,
        in that order.

        .NET web services usually expect "/" as separator for "uri" and
        "method". To change SOAP::Lite's behaviour to use uri/method as
        SOAPAction header, use the following code:

            $client->on_action( sub { join '/', @_ } );
        =item on_fault(callback)

            $client->on_fault(sub { popup_dialog($_[1]) });

        Triggered when a method call results in a fault response from the
        server. When it is called, the argument list is first the client
        object itself, followed by the object that encapsulates the fault.
        In the example, the fault object is passed (without the client
        object) to a hypothetical GUI function that presents an error dialog
        with the text of fault extracted from the object (which is covered
        shortly under the SOAP::SOM methods).

    on_nonserialized(callback)
            $client->on_nonserialized(sub { die "$_[0]?!?" });

        Occasionally, the serializer may be given data it can't turn into
        SOAP-savvy XML; for example, if a program bug results in a code
        reference or something similar being passed in as a parameter to
        method call. When that happens, this callback is activated, with one
        argument. That argument is the data item that could not be
        understood. It will be the only argument. If the routine returns,
        the return value is pasted into the message as the serialization.
        Generally, an error is in order, and this callback allows for
        control over signaling that error.

    on_debug(callback)
            $client->on_debug(sub { print @_ });

        Deprecated. Use the global +debug and +trace facilities described in
        SOAP::Trace

        Note that this method will not work as expected: Instead of
        affecting the debugging behaviour of the object called on, it will
        globally affect the debugging behaviour for all objects of that
        class.

WRITING A SOAP CLIENT
    This chapter guides you to writing a SOAP client by example.

    The SOAP service to be accessed is a simple variation of the well-known
    hello world program. It accepts two parameters, a name and a given name,
    and returns "Hello $given_name $name".

    We will use "Martin Kutter" as the name for the call, so all variants
    will print the following message on success:

     Hello Martin Kutter!

  SOAP message styles
    There are three common (and one less common) variants of SOAP messages.

    These address the message style (positional parameters vs. specified
    message documents) and encoding (as-is vs. typed).

    The different message styles are:

    *   rpc/encoded

        Typed, positional parameters. Widely used in scripting languages.
        The type of the arguments is included in the message. Arrays and the
        like may be encoded using SOAP encoding rules (or others).

    *   rpc/literal

        As-is, positional parameters. The type of arguments is defined by
        some pre-exchanged interface definition.

    *   document/encoded

        Specified message with typed elements. Rarely used.

    *   document/literal

        Specified message with as-is elements. The message specification and
        element types are defined by some pre-exchanged interface
        definition.

    As of 2008, document/literal has become the predominant SOAP message
    variant. rpc/literal and rpc/encoded are still in use, mainly with
    scripting languages, while document/encoded is hardly used at all.

    You will see clients for the rpc/encoded and document/literal SOAP
    variants in this section.

  Example implementations
   RPC/ENCODED
    Rpc/encoded is most popular with scripting languages like perl, php and
    python without the use of a WSDL. Usual method descriptions look like
    this:

     Method: sayHello(string, string)
     Parameters:
        name: string
        givenName: string

    Such a description usually means that you can call a method named
    "sayHello" with two positional parameters, "name" and "givenName", which
    both are strings.

    The message corresponding to this description looks somewhat like this:

     <sayHello xmlns="urn:HelloWorld">
       <s-gensym01 xsi:type="xsd:string">Kutter</s-gensym01>
       <s-gensym02 xsi:type="xsd:string">Martin</s-gensym02>
     </sayHello>

    Any XML tag names may be used instead of the "s-gensym01" stuff -
    parameters are positional, the tag names have no meaning.

    A client producing such a call is implemented like this:

     use SOAP::Lite;
     my $soap = SOAP::Lite->new( proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl');
     $soap->default_ns('urn:HelloWorld');
     my $som = $soap->call('sayHello', 'Kutter', 'Martin');
     die $som->faultstring if ($som->fault);
     print $som->result, "\n";

    You can of course use a one-liner, too...

    Sometimes, rpc/encoded interfaces are described with WSDL definitions. A
    WSDL accepting "named" parameters with rpc/encoded looks like this:

     <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
       xmlns:s="http://www.w3.org/2001/XMLSchema"
       xmlns:s0="urn:HelloWorld"
       targetNamespace="urn:HelloWorld"
       xmlns="http://schemas.xmlsoap.org/wsdl/">
       <types>
         <s:schema targetNamespace="urn:HelloWorld">
         </s:schema>
       </types>
       <message name="sayHello">
         <part name="name" type="s:string" />
         <part name="givenName" type="s:string" />
       </message>
       <message name="sayHelloResponse">
         <part name="sayHelloResult" type="s:string" />
       </message>

       <portType name="Service1Soap">
         <operation name="sayHello">
           <input message="s0:sayHello" />
           <output message="s0:sayHelloResponse" />
         </operation>
       </portType>

       <binding name="Service1Soap" type="s0:Service1Soap">
         <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
             style="rpc" />
         <operation name="sayHello">
           <soap:operation soapAction="urn:HelloWorld#sayHello"/>
           <input>
             <soap:body use="encoded"
               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </input>
           <output>
             <soap:body use="encoded"
               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </output>
         </operation>
       </binding>
       <service name="HelloWorld">
         <port name="HelloWorldSoap" binding="s0:Service1Soap">
           <soap:address location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
         </port>
       </service>
     </definitions>

    The message corresponding to this schema looks like this:

     <sayHello xmlns="urn:HelloWorld">
       <name xsi:type="xsd:string">Kutter</name>
       <givenName xsi:type="xsd:string">Martin</givenName>
     </sayHello>

    A web service client using this schema looks like this:

     use SOAP::Lite;
     my $soap = SOAP::Lite->service("file:say_hello_rpcenc.wsdl");
     eval { my $result = $soap->sayHello('Kutter', 'Martin'); };
     if ($@) {
         die $@;
     }
     print $som->result();

    You may of course also use the following one-liner:

     perl -MSOAP::Lite -e 'print SOAP::Lite->service("file:say_hello_rpcenc.wsdl")\
       ->sayHello('Kutter', 'Martin'), "\n";'

    A web service client (without a service description) looks like this.

     use SOAP::Lite;
     my $soap = SOAP::Lite->new( proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl');
     $soap->default_ns('urn:HelloWorld');
     my $som = $soap->call('sayHello',
        SOAP::Data->name('name')->value('Kutter'),
        SOAP::Data->name('givenName')->value('Martin')
     );
     die $som->faultstring if ($som->fault);
     print $som->result, "\n";

   RPC/LITERAL
    SOAP web services using the document/literal message encoding are
    usually described by some Web Service Definition. Our web service has
    the following WSDL description:

     <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
       xmlns:s="http://www.w3.org/2001/XMLSchema"
       xmlns:s0="urn:HelloWorld"
       targetNamespace="urn:HelloWorld"
       xmlns="http://schemas.xmlsoap.org/wsdl/">
       <types>
         <s:schema targetNamespace="urn:HelloWorld">
           <s:complexType name="sayHello">
             <s:sequence>
               <s:element minOccurs="0" maxOccurs="1" name="name"
                  type="s:string" />
               <s:element minOccurs="0" maxOccurs="1" name="givenName"
                  type="s:string" nillable="1" />
             </s:sequence>
           </s:complexType>

           <s:complexType name="sayHelloResponse">
             <s:sequence>
               <s:element minOccurs="0" maxOccurs="1" name="sayHelloResult"
                  type="s:string" />
             </s:sequence>
           </s:complexType>
         </s:schema>
       </types>
       <message name="sayHello">
         <part name="parameters" type="s0:sayHello" />
       </message>
       <message name="sayHelloResponse">
         <part name="parameters" type="s0:sayHelloResponse" />
       </message>

       <portType name="Service1Soap">
         <operation name="sayHello">
           <input message="s0:sayHello" />
           <output message="s0:sayHelloResponse" />
         </operation>
       </portType>

       <binding name="Service1Soap" type="s0:Service1Soap">
         <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
             style="rpc" />
         <operation name="sayHello">
           <soap:operation soapAction="urn:HelloWorld#sayHello"/>
           <input>
             <soap:body use="literal" namespace="urn:HelloWorld"/>
           </input>
           <output>
             <soap:body use="literal" namespace="urn:HelloWorld"/>
           </output>
         </operation>
       </binding>
       <service name="HelloWorld">
         <port name="HelloWorldSoap" binding="s0:Service1Soap">
           <soap:address location="http://localhost:80//helloworld.pl" />
         </port>
       </service>
      </definitions>

    The XML message (inside the SOAP Envelope) look like this:

     <ns0:sayHello xmlns:ns0="urn:HelloWorld">
        <parameters>
          <name>Kutter</name>
          <givenName>Martin</givenName>
        </parameters>
     </ns0:sayHello>

     <sayHelloResponse xmlns:ns0="urn:HelloWorld">
        <parameters>
            <sayHelloResult>Hello Martin Kutter!</sayHelloResult>
        </parameters>
     </sayHelloResponse>

    This is the SOAP::Lite implementation for the web service client:

     use SOAP::Lite +trace;
     my $soap = SOAP::Lite->new( proxy => 'http://localhost:80/helloworld.pl');

     $soap->on_action( sub { "urn:HelloWorld#sayHello" });
     $soap->autotype(0)->readable(1);
     $soap->default_ns('urn:HelloWorld');

     my $som = $soap->call('sayHello', SOAP::Data->name('parameters')->value(
        \SOAP::Data->value([
            SOAP::Data->name('name')->value( 'Kutter' ),
            SOAP::Data->name('givenName')->value('Martin'),
        ]))
    );

     die $som->fault->{ faultstring } if ($som->fault);
     print $som->result, "\n";

   DOCUMENT/LITERAL
    SOAP web services using the document/literal message encoding are
    usually described by some Web Service Definition. Our web service has
    the following WSDL description:

     <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns:s="http://www.w3.org/2001/XMLSchema"
        xmlns:s0="urn:HelloWorld"
        targetNamespace="urn:HelloWorld"
        xmlns="http://schemas.xmlsoap.org/wsdl/">
       <types>
         <s:schema targetNamespace="urn:HelloWorld">
           <s:element name="sayHello">
             <s:complexType>
               <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
                   <s:element minOccurs="0" maxOccurs="1" name="givenName" type="s:string" nillable="1" />
               </s:sequence>
              </s:complexType>
            </s:element>

            <s:element name="sayHelloResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="sayHelloResult" type="s:string" />
                </s:sequence>
            </s:complexType>
          </s:element>
        </types>
        <message name="sayHelloSoapIn">
          <part name="parameters" element="s0:sayHello" />
        </message>
        <message name="sayHelloSoapOut">
          <part name="parameters" element="s0:sayHelloResponse" />
        </message>

        <portType name="Service1Soap">
          <operation name="sayHello">
            <input message="s0:sayHelloSoapIn" />
            <output message="s0:sayHelloSoapOut" />
          </operation>
        </portType>

        <binding name="Service1Soap" type="s0:Service1Soap">
          <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
              style="document" />
          <operation name="sayHello">
            <soap:operation soapAction="urn:HelloWorld#sayHello"/>
            <input>
              <soap:body use="literal" />
            </input>
            <output>
              <soap:body use="literal" />
            </output>
          </operation>
        </binding>
        <service name="HelloWorld">
          <port name="HelloWorldSoap" binding="s0:Service1Soap">
            <soap:address location="http://localhost:80//helloworld.pl" />
          </port>
        </service>
     </definitions>

    The XML message (inside the SOAP Envelope) look like this:

     <sayHello xmlns="urn:HelloWorld">
       <name>Kutter</name>
       <givenName>Martin</givenName>
     </sayHello>

     <sayHelloResponse>
       <sayHelloResult>Hello Martin Kutter!</sayHelloResult>
     </sayHelloResponse>

    You can call this web service with the following client code:

     use SOAP::Lite;
     my $soap = SOAP::Lite->new( proxy => 'http://localhost:80/helloworld.pl');

     $soap->on_action( sub { "urn:HelloWorld#sayHello" });
     $soap->autotype(0);
     $soap->default_ns('urn:HelloWorld');

     my $som = $soap->call("sayHello",
        SOAP::Data->name('name')->value( 'Kutter' ),
        SOAP::Data->name('givenName')->value('Martin'),
    );

     die $som->fault->{ faultstring } if ($som->fault);
     print $som->result, "\n";

  Differences between the implementations
    You may have noticed that there's little difference between the
    rpc/encoded, rpc/literal and the document/literal example's
    implementation. In fact, from SOAP::Lite's point of view, the only
    differences between rpc/literal and document/literal that parameters are
    always named.

    In our example, the rpc/encoded variant already used named parameters
    (by using two messages), so there's no difference at all.

    You may have noticed the somewhat strange idiom for passing a list of
    named paraneters in the rpc/literal example:

     my $som = $soap->call('sayHello', SOAP::Data->name('parameters')->value(
        \SOAP::Data->value([
            SOAP::Data->name('name')->value( 'Kutter' ),
            SOAP::Data->name('givenName')->value('Martin'),
        ]))
     );

    While SOAP::Data provides full control over the XML generated, passing
    hash-like structures require additional coding.

WRITING A SOAP SERVER
    See SOAP::Server, or SOAP::Transport.

FEATURES
  ATTACHMENTS
    "SOAP::Lite" features support for the SOAP with Attachments
    specification. Currently, SOAP::Lite only supports MIME based
    attachments. DIME based attachments are yet to be fully functional.

   EXAMPLES
   Client sending an attachment
    "SOAP::Lite" clients can specify attachments to be sent along with a
    request by using the "SOAP::Lite::parts()" method, which takes as an
    argument an ARRAY of "MIME::Entity"'s.

      use SOAP::Lite;
      use MIME::Entity;
      my $ent = build MIME::Entity
        Type        => "image/gif",
        Encoding    => "base64",
        Path        => "somefile.gif",
        Filename    => "saveme.gif",
        Disposition => "attachment";
      my $som = SOAP::Lite
        ->uri($SOME_NAMESPACE)
        ->parts([ $ent ])
        ->proxy($SOME_HOST)
        ->some_method(SOAP::Data->name("foo" => "bar"));

   Client retrieving an attachment
    A client accessing attachments that were returned in a response by using
    the "SOAP::SOM::parts()" accessor.

      use SOAP::Lite;
      use MIME::Entity;
      my $soap = SOAP::Lite
        ->uri($NS)
        ->proxy($HOST);
      my $som = $soap->foo();
      foreach my $part (${$som->parts}) {
        print $part->stringify;
      }

   Server receiving an attachment
    Servers, like clients, use the SOAP::SOM module to access attachments
    transmitted to it.

      package Attachment;
      use SOAP::Lite;
      use MIME::Entity;
      use strict;
      use vars qw(@ISA);
      @ISA = qw(SOAP::Server::Parameters);
      sub someMethod {
        my $self = shift;
        my $envelope = pop;
        foreach my $part (@{$envelope->parts}) {
          print "AttachmentService: attachment found! (".ref($part).")\n";
        }
        # do something
      }

   Server responding with an attachment
    Servers wishing to return an attachment to the calling client need only
    return "MIME::Entity" objects along with SOAP::Data elements, or any
    other data intended for the response.

      package Attachment;
      use SOAP::Lite;
      use MIME::Entity;
      use strict;
      use vars qw(@ISA);
      @ISA = qw(SOAP::Server::Parameters);
      sub someMethod {
        my $self = shift;
        my $envelope = pop;
        my $ent = build MIME::Entity
        'Id'          => "<1234>",
        'Type'        => "text/xml",
        'Path'        => "some.xml",
        'Filename'    => "some.xml",
        'Disposition' => "attachment";
        return SOAP::Data->name("foo" => "blah blah blah"),$ent;
      }

  DEFAULT SETTINGS
    Though this feature looks similar to autodispatch they have (almost)
    nothing in common. This capability allows you specify default settings
    so that all objects created after that will be initialized with the
    proper default settings.

    If you wish to provide common "proxy()" or "uri()" settings for all
    "SOAP::Lite" objects in your application you may do:

      use SOAP::Lite
        proxy => 'http://localhost/cgi-bin/soap.cgi',
        uri => 'http://my.own.com/My/Examples';

      my $soap1 = new SOAP::Lite; # will get the same proxy()/uri() as above
      print $soap1->getStateName(1)->result;

      my $soap2 = SOAP::Lite->new; # same thing as above
      print $soap2->getStateName(2)->result;

      # or you may override any settings you want
      my $soap3 = SOAP::Lite->proxy('http://localhost/');
      print $soap3->getStateName(1)->result;

    Any "SOAP::Lite" properties can be propagated this way. Changes in
    object copies will not affect global settings and you may still change
    global settings with "SOAP::Lite->self" call which returns reference to
    global object. Provided parameter will update this object and you can
    even set it to "undef":

      SOAP::Lite->self(undef);

    The "use SOAP::Lite" syntax also lets you specify default event handlers
    for your code. If you have different SOAP objects and want to share the
    same "on_action()" (or "on_fault()" for that matter) handler. You can
    specify "on_action()" during initialization for every object, but you
    may also do:

      use SOAP::Lite
        on_action => sub {sprintf '%s#%s', @_};

    and this handler will be the default handler for all your SOAP objects.
    You can override it if you specify a handler for a particular object.
    See t/*.t for example of on_fault() handler.

    Be warned, that since "use ..." is executed at compile time all "use"
    statements will be executed before script execution that can make
    unexpected results. Consider code:

      use SOAP::Lite proxy => 'http://localhost/';
      print SOAP::Lite->getStateName(1)->result;

      use SOAP::Lite proxy => 'http://localhost/cgi-bin/soap.cgi';
      print SOAP::Lite->getStateName(1)->result;

    Both SOAP calls will go to 'http://localhost/cgi-bin/soap.cgi'. If you
    want to execute "use" at run-time, put it in "eval":

      eval "use SOAP::Lite proxy => 'http://localhost/cgi-bin/soap.cgi'; 1" or die;

    Or alternatively,

      SOAP::Lite->self->proxy('http://localhost/cgi-bin/soap.cgi');

  SETTING MAXIMUM MESSAGE SIZE
    One feature of "SOAP::Lite" is the ability to control the maximum size
    of a message a SOAP::Lite server will be allowed to process. To control
    this feature simply define $SOAP::Constants::MAX_CONTENT_SIZE in your
    code like so:

      use SOAP::Transport::HTTP;
      use MIME::Entity;
      $SOAP::Constants::MAX_CONTENT_SIZE = 10000;
      SOAP::Transport::HTTP::CGI
        ->dispatch_to('TemperatureService')
        ->handle;

  IN/OUT, OUT PARAMETERS AND AUTOBINDING
    "SOAP::Lite" gives you access to all parameters (both in/out and out)
    and also does some additional work for you. Lets consider following
    example:

      <mehodResponse>
        <res1>name1</res1>
        <res2>name2</res2>
        <res3>name3</res3>
      </mehodResponse>

    In that case:

      $result = $r->result; # gives you 'name1'
      $paramout1 = $r->paramsout;      # gives you 'name2', because of scalar context
      $paramout1 = ($r->paramsout)[0]; # gives you 'name2' also
      $paramout2 = ($r->paramsout)[1]; # gives you 'name3'

    or

      @paramsout = $r->paramsout; # gives you ARRAY of out parameters
      $paramout1 = $paramsout[0]; # gives you 'res2', same as ($r->paramsout)[0]
      $paramout2 = $paramsout[1]; # gives you 'res3', same as ($r->paramsout)[1]

    Generally, if server returns "return (1,2,3)" you will get 1 as the
    result and 2 and 3 as out parameters.

    If the server returns "return [1,2,3]" you will get an ARRAY reference
    from "result()" and "undef" from "paramsout()".

    Results can be arbitrary complex: they can be an array references, they
    can be objects, they can be anything and still be returned by "result()"
    . If only one parameter is returned, "paramsout()" will return "undef".

    Furthermore, if you have in your output parameters a parameter with the
    same signature (name+type) as in the input parameters this parameter
    will be mapped into your input automatically. For example:

    Server Code:

      sub mymethod {
        shift; # object/class reference
        my $param1 = shift;
        my $param2 = SOAP::Data->name('myparam' => shift() * 2);
        return $param1, $param2;
      }

    Client Code:

      $a = 10;
      $b = SOAP::Data->name('myparam' => 12);
      $result = $soap->mymethod($a, $b);

    After that, "$result == 10 and $b->value == 24"! Magic? Sort of.

    Autobinding gives it to you. That will work with objects also with one
    difference: you do not need to worry about the name and the type of
    object parameter. Consider the "PingPong" example
    (examples/My/PingPong.pm and examples/pingpong.pl):

    Server Code:

      package My::PingPong;

      sub new {
        my $self = shift;
        my $class = ref($self) || $self;
        bless {_num=>shift} => $class;
      }

      sub next {
        my $self = shift;
        $self->{_num}++;
      }

    Client Code:

      use SOAP::Lite +autodispatch =>
        uri => 'urn:',
        proxy => 'http://localhost/';

      my $p = My::PingPong->new(10); # $p->{_num} is 10 now, real object returned
      print $p->next, "\n";          # $p->{_num} is 11 now!, object autobinded

  STATIC AND DYNAMIC SERVICE DEPLOYMENT
    Let us scrutinize the deployment process. When designing your SOAP
    server you can consider two kind of deployment: static and dynamic. For
    both, static and dynamic, you should specify "MODULE", "MODULE::method",
    "method" or "PATH/" when creating "use"ing the SOAP::Lite module. The
    difference between static and dynamic deployment is that in case of
    'dynamic', any module which is not present will be loaded on demand. See
    the "SECURITY" section for detailed description.

    When statically deploying a SOAP Server, you need to know all modules
    handling SOAP requests before.

    Dynamic deployment allows extending your SOAP Server's interface by just
    installing another module into the dispatch_to path (see below).

   STATIC DEPLOYMENT EXAMPLE
      use SOAP::Transport::HTTP;
      use My::Examples;           # module is preloaded

      SOAP::Transport::HTTP::CGI
         # deployed module should be present here or client will get
         # 'access denied'
        -> dispatch_to('My::Examples')
        -> handle;

    For static deployment you should specify the MODULE name directly.

    You should also use static binding when you have several different
    classes in one file and want to make them available for SOAP calls.

   DYNAMIC DEPLOYMENT EXAMPLE
      use SOAP::Transport::HTTP;
      # name is unknown, module will be loaded on demand

      SOAP::Transport::HTTP::CGI
        # deployed module should be present here or client will get 'access denied'
        -> dispatch_to('/Your/Path/To/Deployed/Modules', 'My::Examples')
        -> handle;

    For dynamic deployment you can specify the name either directly (in that
    case it will be "require"d without any restriction) or indirectly, with
    a PATH. In that case, the ONLY path that will be available will be the
    PATH given to the dispatch_to() method). For information how to handle
    this situation see "SECURITY" section.

   SUMMARY
      dispatch_to(
        # dynamic dispatch that allows access to ALL modules in specified directory
        PATH/TO/MODULES
        # 1. specifies directory
        # -- AND --
        # 2. gives access to ALL modules in this directory without limits

        # static dispatch that allows access to ALL methods in particular MODULE
        MODULE
        #  1. gives access to particular module (all available methods)
        #  PREREQUISITES:
        #    module should be loaded manually (for example with 'use ...')
        #    -- OR --
        #    you can still specify it in PATH/TO/MODULES

        # static dispatch that allows access to particular method ONLY
        MODULE::method
        # same as MODULE, but gives access to ONLY particular method,
        # so there is not much sense to use both MODULE and MODULE::method
        # for the same MODULE
      );

    In addition to this "SOAP::Lite" also supports an experimental syntax
    that allows you to bind a specific URL or SOAPAction to a CLASS/MODULE
    or object.

    For example:

      dispatch_with({
        URI => MODULE,        # 'http://www.soaplite.com/' => 'My::Class',
        SOAPAction => MODULE, # 'http://www.soaplite.com/method' => 'Another::Class',
        URI => object,        # 'http://www.soaplite.com/obj' => My::Class->new,
      })

    "URI" is checked before "SOAPAction". You may use both the
    "dispatch_to()" and "dispatch_with()" methods in the same server, but
    note that "dispatch_with()" has a higher order of precedence.
    "dispatch_to()" will be checked only after "URI" and "SOAPAction" has
    been checked.

    See also: EXAMPLE APACHE::REGISTRY USAGE, "SECURITY"

  COMPRESSION
    "SOAP::Lite" provides you option to enable transparent compression over
    the wire. Compression can be enabled by specifying a threshold value (in
    the form of kilobytes) for compression on both the client and server
    sides:

    *Note: Compression currently only works for HTTP based servers and
    clients.*

    Client Code

      print SOAP::Lite
        ->uri('http://localhost/My/Parameters')
        ->proxy('http://localhost/', options => {compress_threshold => 10000})
        ->echo(1 x 10000)
        ->result;

    Server Code

      my $server = SOAP::Transport::HTTP::CGI
        ->dispatch_to('My::Parameters')
        ->options({compress_threshold => 10000})
        ->handle;

    For more information see COMPRESSION in HTTP::Transport.

SECURITY
    For security reasons, the existing path for Perl modules (@INC) will be
    disabled once you have chosen dynamic deployment and specified your own
    "PATH/". If you wish to access other modules in your included package
    you have several options:

    1   Switch to static linking:

           use MODULE;
           $server->dispatch_to('MODULE');

        Which can also be useful when you want to import something specific
        from the deployed modules:

           use MODULE qw(import_list);

    2   Change "use" to "require". The path is only unavailable during the
        initialization phase. It is available once more during execution.
        Therefore, if you utilize "require" somewhere in your package, it
        will work.

    3   Wrap "use" in an "eval" block:

           eval 'use MODULE qw(import_list)'; die if $@;

    4   Set your include path in your package and then specify "use". Don't
        forget to put @INC in a "BEGIN{}" block or it won't work. For
        example,

           BEGIN { @INC = qw(my_directory); use MODULE }

INTEROPERABILITY
  Microsoft .NET client with SOAP::Lite Server
    In order to use a .NET client with a SOAP::Lite server, be sure you use
    fully qualified names for your return values. For example:

      return SOAP::Data->name('myname')
                       ->type('string')
                       ->uri($MY_NAMESPACE)
                       ->value($output);

    In addition see comment about default encoding in .NET Web Services
    below.

  SOAP::Lite client with a .NET server
    If experiencing problems when using a SOAP::Lite client to call a .NET
    Web service, it is recommended you check, or adhere to all of the
    following recommendations:

    Declare a proper soapAction in your call
        For example, use "on_action( sub {
        'http://www.myuri.com/WebService.aspx#someMethod'; } )".

    Disable charset definition in Content-type header
        Some users have said that Microsoft .NET prefers the value of the
        Content-type header to be a mimetype exclusively, but SOAP::Lite
        specifies a character set in addition to the mimetype. This results
        in an error similar to:

          Server found request content type to be 'text/xml; charset=utf-8',
          but expected 'text/xml'

        To turn off this behavior specify use the following code:

          use SOAP::Lite;
          $SOAP::Constants::DO_NOT_USE_CHARSET = 1;
          # The rest of your code

    Use fully qualified name for method parameters
        For example, the following code is preferred:

          SOAP::Data->name(Query  => 'biztalk')
                    ->uri('http://tempuri.org/')

        As opposed to:

          SOAP::Data->name('Query'  => 'biztalk')

    Place method in default namespace
        For example, the following code is preferred:

          my $method = SOAP::Data->name('add')
                                 ->attr({xmlns => 'http://tempuri.org/'});
          my @rc = $soap->call($method => @parms)->result;

        As opposed to:

          my @rc = $soap->call(add => @parms)->result;
          # -- OR --
          my @rc = $soap->add(@parms)->result;

    Disable use of explicit namespace prefixes
        Some user's have reported that .NET will simply not parse messages
        that use namespace prefixes on anything but SOAP elements
        themselves. For example, the following XML would not be parsed:

          <SOAP-ENV:Envelope ...attributes skipped>
            <SOAP-ENV:Body>
              <namesp1:mymethod xmlns:namesp1="urn:MyURI" />
            </SOAP-ENV:Body>
          </SOAP-ENV:Envelope>

        SOAP::Lite allows users to disable the use of explicit namespaces
        through the "use_prefix()" method. For example, the following code:

          $som = SOAP::Lite->uri('urn:MyURI')
                           ->proxy($HOST)
                           ->use_prefix(0)
                           ->myMethod();

        Will result in the following XML, which is more palatable by .NET:

          <SOAP-ENV:Envelope ...attributes skipped>
            <SOAP-ENV:Body>
              <mymethod xmlns="urn:MyURI" />
            </SOAP-ENV:Body>
          </SOAP-ENV:Envelope>

    Modify your .NET server, if possible
        Stefan Pharies <stefanph@microsoft.com>:

        SOAP::Lite uses the SOAP encoding (section 5 of the soap 1.1 spec),
        and the default for .NET Web Services is to use a literal encoding.
        So elements in the request are unqualified, but your service expects
        them to be qualified. .Net Web Services has a way for you to change
        the expected message format, which should allow you to get your
        interop working. At the top of your class in the asmx, add this
        attribute (for Beta 1):

          [SoapService(Style=SoapServiceStyle.RPC)]

        Another source said it might be this attribute (for Beta 2):

          [SoapRpcService]

        Full Web Service text may look like:

          <%@ WebService Language="C#" Class="Test" %>
          using System;
          using System.Web.Services;
          using System.Xml.Serialization;

          [SoapService(Style=SoapServiceStyle.RPC)]
          public class Test : WebService {
            [WebMethod]
            public int add(int a, int b) {
              return a + b;
            }
          }

        Another example from Kirill Gavrylyuk <kirillg@microsoft.com>:

        "You can insert [SoapRpcService()] attribute either on your class or
        on operation level".

          <%@ WebService Language=CS class="DataType.StringTest"%>

          namespace DataType {

            using System;
            using System.Web.Services;
            using System.Web.Services.Protocols;
            using System.Web.Services.Description;

           [SoapRpcService()]
           public class StringTest: WebService {
             [WebMethod]
             [SoapRpcMethod()]
             public string RetString(string x) {
               return(x);
             }
           }
         }

        Example from Yann Christensen <yannc@microsoft.com>:

          using System;
          using System.Web.Services;
          using System.Web.Services.Protocols;

          namespace Currency {
            [WebService(Namespace="http://www.yourdomain.com/example")]
            [SoapRpcService]
            public class Exchange {
              [WebMethod]
              public double getRate(String country, String country2) {
                return 122.69;
              }
            }
          }

    Special thanks goes to the following people for providing the above
    description and details on .NET interoperability issues:

    Petr Janata <petr.janata@i.cz>,

    Stefan Pharies <stefanph@microsoft.com>,

    Brian Jepson <bjepson@jepstone.net>, and others

TROUBLESHOOTING
    SOAP::Lite serializes "18373" as an integer, but I want it to be a
    string!
        SOAP::Lite guesses datatypes from the content provided, using a set
        of common-sense rules. These rules are not 100% reliable, though
        they fit for most data.

        You may force the type by passing a SOAP::Data object with a type
        specified:

         my $proxy = SOAP::Lite->proxy('http://www.example.org/soapservice');
         my $som = $proxy->myMethod(
             SOAP::Data->name('foo')->value(12345)->type('string')
         );

        You may also change the precedence of the type-guessing rules. Note
        that this means fiddling with SOAP::Lite's internals - this may not
        work as expected in future versions.

        The example above forces everything to be encoded as string (this is
        because the string test is normally last and allways returns true):

          my @list = qw(-1 45 foo bar 3838);
          my $proxy = SOAP::Lite->uri($uri)->proxy($proxyUrl);
          my $lookup = $proxy->serializer->typelookup;
          $lookup->{string}->[0] = 0;
          $proxy->serializer->typelookup($lookup);
          $proxy->myMethod(\@list);

        See SOAP::Serializer for more details.

    "+autodispatch" doesn't work in Perl 5.8
        There is a bug in Perl 5.8's "UNIVERSAL::AUTOLOAD" functionality
        that prevents the "+autodispatch" functionality from working
        properly. The workaround is to use "dispatch_from" instead. Where
        you might normally do something like this:

           use Some::Module;
           use SOAP::Lite +autodispatch =>
               uri => 'urn:Foo'
               proxy => 'http://...';

        You would do something like this:

           use SOAP::Lite dispatch_from(Some::Module) =>
               uri => 'urn:Foo'
               proxy => 'http://...';

    Problems using SOAP::Lite's COM Interface

        Can't call method "server" on undefined value
            You probably did not register Lite.dll using "regsvr32 Lite.dll"

        Failed to load PerlCtrl Runtime
            It is likely that you have install Perl in two different
            locations and the location of ActiveState's Perl is not the
            first instance of Perl specified in your PATH. To rectify,
            rename the directory in which the non-ActiveState Perl is
            installed, or be sure the path to ActiveState's Perl is
            specified prior to any other instance of Perl in your PATH.

    Dynamic libraries are not found
        If you are using the Apache web server, and you are seeing something
        like the following in your webserver log file:

          Can't load '/usr/local/lib/perl5/site_perl/.../XML/Parser/Expat/Expat.so'
            for module XML::Parser::Expat: dynamic linker: /usr/local/bin/perl:
            libexpat.so.0 is NEEDED, but object does not exist at
            /usr/local/lib/perl5/.../DynaLoader.pm line 200.

        Then try placing the following into your httpd.conf file and see if
        it fixes your problem.

         <IfModule mod_env.c>
             PassEnv LD_LIBRARY_PATH
         </IfModule>

    SOAP client reports "500 unexpected EOF before status line seen
        See "Apache is crashing with segfaults"

    Apache is crashing with segfaults
        Using "SOAP::Lite" (or XML::Parser::Expat) in combination with
        mod_perl causes random segmentation faults in httpd processes. To
        fix, try configuring Apache with the following:

         RULE_EXPAT=no

        If you are using Apache 1.3.20 and later, try configuring Apache
        with the following option:

         ./configure --disable-rule=EXPAT

        See http://archive.covalent.net/modperl/2000/04/0185.xml for more
        details and lot of thanks to Robert Barta <rho@bigpond.net.au> for
        explaining this weird behavior.

        If this doesn't address the problem, you may wish to try
        "-Uusemymalloc", or a similar option in order to instruct Perl to
        use the system's own "malloc".

        Thanks to Tim Bunce <Tim.Bunce@pobox.com>.

    CGI scripts do not work under Microsoft Internet Information Server
    (IIS)
        CGI scripts may not work under IIS unless scripts use the ".pl"
        extension, opposed to ".cgi".

    Java SAX parser unable to parse message composed by SOAP::Lite
        In some cases SOAP messages created by "SOAP::Lite" may not be
        parsed properly by a SAX2/Java XML parser. This is due to a known
        bug in "org.xml.sax.helpers.ParserAdapter". This bug manifests
        itself when an attribute in an XML element occurs prior to the XML
        namespace declaration on which it depends. However, according to the
        XML specification, the order of these attributes is not significant.

        http://www.megginson.com/SAX/index.html

        Thanks to Steve Alpert (Steve_Alpert@idx.com) for pointing on it.

PERFORMANCE
    Processing of XML encoded fragments
        "SOAP::Lite" is based on XML::Parser which is basically wrapper
        around James Clark's expat parser. Expat's behavior for parsing XML
        encoded string can affect processing messages that have lot of
        encoded entities, like XML fragments, encoded as strings. Providing
        low-level details, parser will call char() callback for every
        portion of processed stream, but individually for every processed
        entity or newline. It can lead to lot of calls and additional memory
        manager expenses even for small messages. By contrast, XML messages
        which are encoded as base64Binary, don't have this problem and
        difference in processing time can be significant. For XML encoded
        string that has about 20 lines and 30 tags, number of call could be
        about 100 instead of one for the same string encoded as
        base64Binary.

        Since it is parser's feature there is NO fix for this behavior (let
        me know if you find one), especially because you need to parse
        message you already got (and you cannot control content of this
        message), however, if your are in charge for both ends of processing
        you can switch encoding to base64 on sender's side. It will
        definitely work with SOAP::Lite and it may work with other
        toolkits/implementations also, but obviously I cannot guarantee
        that.

        If you want to encode specific string as base64, just do
        "SOAP::Data->type(base64 => $string)" either on client or on server
        side. If you want change behavior for specific instance of
        SOAP::Lite, you may subclass "SOAP::Serializer", override
        "as_string()" method that is responsible for string encoding (take a
        look into "as_base64Binary()") and specify new serializer class for
        your SOAP::Lite object with:

          my $soap = new SOAP::Lite
            serializer => My::Serializer->new,
            ..... other parameters

        or on server side:

          my $server = new SOAP::Transport::HTTP::Daemon # or any other server
            serializer => My::Serializer->new,
            ..... other parameters

        If you want to change this behavior for all instances of SOAP::Lite,
        just substitute "as_string()" method with "as_base64Binary()"
        somewhere in your code after "use SOAP::Lite" and before actual
        processing/sending:

          *SOAP::Serializer::as_string = \&SOAP::XMLSchema2001::Serializer::as_base64Binary;

        Be warned that last two methods will affect all strings and convert
        them into base64 encoded. It doesn't make any difference for
        SOAP::Lite, but it may make a difference for other toolkits.

BUGS AND LIMITATIONS
    *   No support for multidimensional, partially transmitted and sparse
        arrays (however arrays of arrays are supported, as well as any other
        data structures, and you can add your own implementation with
        SOAP::Data).

    *   Limited support for WSDL schema.

    *   XML::Parser::Lite relies on Unicode support in Perl and doesn't do
        entity decoding.

    *   Limited support for mustUnderstand and Actor attributes.

PLATFORM SPECIFICS
    MacOS
        Information about XML::Parser for MacPerl could be found here:

        http://bumppo.net/lists/macperl-modules/1999/07/msg00047.html

        Compiled XML::Parser for MacOS could be found here:

        http://www.perl.com/CPAN-local/authors/id/A/AS/ASANDSTRM/XML-Parser-
        2.27-bin-1-MacOS.tgz

RELATED MODULES
  Transport Modules
    SOAP::Lite allows one to add support for additional transport protocols,
    or server handlers, via separate modules implementing the
    SOAP::Transport::* interface. The following modules are available from
    CPAN:

    *   SOAP-Transport-HTTP-Nginx

        SOAP::Transport::HTTP::Nginx provides a transport module for nginx
        (<http://nginx.net/>)

AVAILABILITY
    You can download the latest version SOAP::Lite for Unix or SOAP::Lite
    for Win32 from the following sources:

     * CPAN:                http://search.cpan.org/search?dist=SOAP-Lite

    You are welcome to send e-mail to the maintainers of SOAP::Lite with
    your comments, suggestions, bug reports and complaints.

ACKNOWLEDGEMENTS
    Special thanks to Randy J. Ray, author of *Programming Web Services with
    Perl*, who has contributed greatly to the documentation effort of
    SOAP::Lite.

    Special thanks to O'Reilly publishing which has graciously allowed
    SOAP::Lite to republish and redistribute the SOAP::Lite reference manual
    found in Appendix B of *Programming Web Services with Perl*.

    And special gratitude to all the developers who have contributed
    patches, ideas, time, energy, and help in a million different forms to
    the development of this software.

HACKING
    Latest development takes place on GitHub.com. Come on by and fork it.

    git@github.com:redhotpenguin/soaplite.git

    Also see the HACKING file.

    Actively recruiting maintainers for this module. Come and get it on!

REPORTING BUGS
    Please use rt.cpan.org or github to report bugs. Pull requests are
    preferred.

COPYRIGHT
    Copyright (C) 2000-2007 Paul Kulchenko. All rights reserved.

    Copyright (C) 2007-2008 Martin Kutter

    Copyright (C) 2013 Fred Moyer

LICENSE
    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

    This text and all associated documentation for this library is made
    available under the Creative Commons Attribution-NoDerivs 2.0 license.
    http://creativecommons.org/licenses/by-nd/2.0/

AUTHORS
    Paul Kulchenko (paulclinger@yahoo.com)

    Randy J. Ray (rjray@blackperl.com)

    Byrne Reese (byrne@majordojo.com)

    Martin Kutter (martin.kutter@fen-net.de)

    Fred Moyer (fred@redhotpenguin.com)