eps*_*lbe 5 xml soap haskell otrs
我尝试与otrs-ticketsystem进行交互,以制作一些图片并计算一些统计数据。我想这样做haskell-我使用了包装soap。
忽略导入语句的代码非常简单,我创建了一个带配置文件的SOAP-Transport soap.cfg(请参见下文)。然后构造SOAP-Body并使用调用Web服务"Dispatch"。
{-# LANGUAGE OverloadedStrings #-}
import Network (withSocketsDo)
import Network.SOAP
import Network.SOAP.Transport.HTTP
import Text.XML.Writer
import Text.XML.Stream.Parse as Parse
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.ByteString.Lazy.Char8 as BS
import Data.Configurator (load, Worth(Required))
main :: IO ()
main = withSocketsDo $ do
transport <- confTransport "soap" =<< load [Required "./src/SOAP/soap.cfg"]
let body = do element "TicketObject" ("TicketSearch" :: Text)
element "OwnerID" ("owner" :: Text)
xmlresult <- invokeWS transport "#TicketObject" () body (RawParser id)
BS.putStrLn xmlresult
Run Code Online (Sandbox Code Playgroud)
soap.cfg
soap {
url = "http://domain/otrs/rpc.pl"
user = "testuser"
password = "testpass"
trace = true
timeout = 15
}
Run Code Online (Sandbox Code Playgroud)
如果我构建并调用此程序,则会得到以下信息xmlresult:
请求:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<TicketObject>TicketSearch</TicketObject>
<OwnerID>heu</OwnerID>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
响应:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>
SOAPAction shall match 'uri#method' if present (got 'Dispatch', expected '#TicketObject'
</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
如果我再更改以下行
xmlresult <- invokeWS transport "Dispatch" () body (RawParser id)
Run Code Online (Sandbox Code Playgroud)
至
xmlresult <- invokeWS transport "#TicketObject" () body (RawParser id)
Run Code Online (Sandbox Code Playgroud)
故障字符串变为
<faultstring>
Denied access to method (TicketObject) in class (main) at /opt/otrs/Kernel/cpan-lib/SOAP/Lite.pm line 2810.
</faultstring>
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了一些解决方案,但我只找到了这个
在最后一个中,我成功地获得了结果-但仅适用于iPhoneObject和TicketGet-不幸的是,似乎不支持TicketSearch。
我还发现了如何使用肥皂请求.Net(使用Web服务)来创建OTS票证,但不幸的是,我不知道如何创建这样的服务。
您将在使用 javax.xml.soap 无需 WSDL 访问 OTRS SOAP 服务中找到 XML 片段。
这里是perl 脚本生成的请求跟踪
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 707
Content-Type: text/xml; charset=utf-8
SOAPAction: "/Core#Dispatch"
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><Dispatch xmlns="/Core"><Username xsi:type="xsd:string">foo</Username><Password xsi:type="xsd:string">bar</Password><Object xsi:type="xsd:string">TicketObject</Object><Method xsi:type="xsd:string">TicketSearch</Method><Param1_Name xsi:type="xsd:string">TicketID</Param1_Name><Param1_Value xsi:type="xsd:int">561141</Param1_Value></Dispatch></soap:Body></soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x557656ccebb0)
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Connection: close
Date: Mon, 18 Mar 2019 16:35:20 GMT
Vary: Accept-Encoding
Content-Length: 416
Content-Type: text/xml; charset=utf-8
Client-Date: Mon, 18 Mar 2019 16:35:21 GMT
Client-Peer: 85.239.118.197:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
Client-SSL-Cert-Subject: /OU=Domain Control Validated/OU=EssentialSSL Wildcard/CN=*.pyur.com
Client-SSL-Cipher: ECDHE-RSA-AES128-GCM-SHA256
Client-SSL-Socket-Class: IO::Socket::SSL
Set-Cookie: TS0179c75b=013dfe6b3e1266bc1210a8bb5e6a9352943012e3f1d5767b07f5ec8a310bb53c004c09e467d982f0117fe8a3f6aa1dee4e812153c4; Path=/; Domain=.ticketsystem.pyur.com
SOAPServer: SOAP::Lite/Perl/1.11
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><DispatchResponse xmlns="/Core" xsi:nil="true" /></soap:Body></soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |