#java #soap #groovy #webservices-client
#java #soap #groovy #веб-сервисы-клиент
Вопрос:
Я создал следующую программу groovy test.groovy для вызова веб-службы издателя BI. Я могу получить ответ soap. Может кто-нибудь, пожалуйста, помочь мне записать soapresponse (Envelope.Body.runReportResponse.runReportReturn.reportBytes ) в файл pdf.
----------------------- test.groovy ------------------------------------
String username = "Administrator"
String password = "Administrator"
String attributeFormat = "pdf"
String attributeLocale = "en-US"
String reportAbsolutePath = "/WebserviceTest/eodnoticeofdormancy/eodnoticeofdormancy.xdo"
String attributeTemplate = "Notice"
String p_reportdate = "2011-04-08"
def soapRequest = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
<soapenv:Header/>
<soapenv:Body>
<pub:runReport>
<pub:reportRequest>
<pub:attributeFormat>${attributeFormat}</pub:attributeFormat>
<pub:attributeLocale>${attributeLocale}</pub:attributeLocale>
<pub:attributeTemplate>${attributeTemplate}</pub:attributeTemplate>
<pub:flattenXML>true</pub:flattenXML>
<pub:parameterNameValues>
<!--Zero or more repetitions:-->
<pub:item>
<pub:multiValuesAllowed>false</pub:multiValuesAllowed>
<pub:name>p_reportdate</pub:name>
<pub:values>
<pub:item>${p_reportdate}</pub:item>
</pub:values>
</pub:item>
</pub:parameterNameValues>
<pub:reportAbsolutePath>${reportAbsolutePath}</pub:reportAbsolutePath>
<pub:sizeOfDataChunkDownload>1024</pub:sizeOfDataChunkDownload>
</pub:reportRequest>
<pub:userID>Administrator</pub:userID>
<pub:password>Administrator</pub:password>
</pub:runReport>
</soapenv:Body>
</soapenv:Envelope>"""
try {
def soapUrl = new URL("http://localhost/xmlpserver/services/PublicReportService")
def connection = soapUrl.openConnection()
connection.setRequestMethod("POST")
connection.setRequestProperty("Content-Type" ,"text/html")
connection.setRequestProperty("SOAPAction", "")
connection.doOutput = true
Writer writer = new OutputStreamWriter(connection.outputStream)
writer.write(soapRequest)
writer.flush()
writer.close()
connection.connect()
def soapResponse = connection.content.text
def Envelope = new XmlSlurper().parseText(soapResponse)
println soapResponse
String reportBytes = Envelope.Body.runReportResponse.runReportReturn.reportBytes
String reportContentType = Envelope.Body.runReportResponse.runReportReturn.reportContentType
} catch (Exception e) {
println "Error occurred"
println "--------------"
println e
e.printStackTrace();
}
——————— ответ soap программы выглядит следующим образом —————
JVBERi0xLjQNCjUgMCBvYmoNCjw8DQovVHlwZSAvWE9iamVjdA0KL1N1YnR5cGUgL0ltYWdlDQovRmlsdGVyIC9EQ1REZWNvZGUNCi9MZW5ndGggNDM3NTINCi9XaWR0aCAxNDU3DQovSGVpZ2h0IDIyNA0KL0JpdHNQZXJDb21wb25lbnQgOA0KL0NvbG9yU3BhY2UgL0RldmljZVJHQg0KPj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADgBbEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4 Tl5ufo6erx8vP09fb3 Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 Pn6/9oADAMBAAIRAxEAPwDkf GgPHH/AD00/wD8Bv8A69H/AA0B44/56af/AOA3/wBevLaKAPUv GgPHH/PTT//AAG/ vR/w0B44/56af8A A3/ANevLaKAPpP4PfFDxH428W3em6u1qbeKxedfJh2HcJI1HOemGNe2V8wfs4/8lD1D/sFSf jYq n6ACiiigArH1/xRo/hm3EuqXixMw/dxL80kn 6o5/HpXNeKfHhgubjStCeJrm3Xde3z4aKyTcAxx/Gw3D5RnHvyK8sfULq5jur7T5NqbSl5rmoHc0jlGRo4 PusDkIFLDrkAcb06Lesg==application/pdfxmlp25327697.tmp
Ответ №1:
Возвращаемая строка имеет кодировку Base64 с некоторыми символами в конце, которые, по-видимому, указывают на тип содержимого («application / pdf») и исходное имя файла («xmlp25327697.tmp»). Если вы удалите все, начинающееся с «application», вы можете затем декодировать строку в байты и записать ее в файл, подобный этому:
byte[] decoded = reportBytes.decodeBase64()
def myFile = new File('something.pdf')
myFile.bytes = decoded