Hola,

Efectivamente, el resultado se queda en el navegador y, viendo el código fuente de la página, hay que copiarlo en un fichero nuevo. Supongo que esto se podría definir de alguna forma como parámetro del enlace o algo en Visual Studio

Investigando un poco mas la documentación de ZEN.Template no resulta complicado implementar nuevos métodos.

Siguiendo los mismos pasos que para el asistente SOAP, incluye la siguiente entrada en la lista de links y tendrás nuevos asistentes.

Installer Wizard

"Installer Wizard": "${serverUrl}/isc/studio/templates/%25Installer.InstallerWizard.cls?Namespace=${namespace}${serverAuth}"
 

DeepSeek PI Wizard

"DeepSeek PI Wizard": "${serverUrl}/isc/studio/templates/%25DeepSee.Template.DeepSeeKPIWizard.cls?Namespace=${namespace}${serverAuth}"

Buenas David,

Desde Visual Code no se han implementado los wizards de la misma forma que están en Studio, muchos de estos asistentes estaban programados en exclusiva para Studio, otros estaban pensados para acceder desde Atelier, a través de su server template, como el asistente de SOAP.

Podrás incorporarlo en Visual studio siguiendo los siguientes pasos

Asistente para cliente SOAP

https://es.community.intersystems.com/post/trucos-y-consejos-de-vscode-a...

Supongo que poco a poco, la comunidad podrá ir aportando algunos trucos para tener lo mismo que en Atelier.

Un saludo,
Kurro

Esto es lo que ha devuelto el log

09/23/2021 16:04:36 *********************
Output from Web client with SOAP action = http://ws.myprovider.org/buscarInfo
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>
  <SOAP-ENV:Body><buscarInfo xmlns="http://ws.myProvider.salutic.org/"><idEspecialidad xsi:type="s:string">CT</idEspecialidad><centroSanitario xsi:type="s:string">CG</centroSanitario><infoAdicional xmlns:s01="http://ws.myProvider.salutic.org/" xsi:type="s01:infoAdicionalType"><ambulancia xsi:type="s:boolean">false</ambulancia><urgencia xsi:type="s:boolean">false</urgencia><gravedad xsi:type="s:boolean">false</gravedad><anestesia xsi:type="s:boolean">false</anestesia><claustrofobia xsi:type="s:boolean">false</claustrofobia></infoAdicional></buscarInfo></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

09/23/2021 16:04:36 *********************
Input to Web client with SOAP action = http://ws.myProvider.org/buscarInfo

ERROR #6243: La solicitud HTTP a SOAP WebService ha devuelto una respuesta con CONTENT-TYPE inesperado: application/wsdl+xml.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://ws.myProvider.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.myProvider.org/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsdl:documentation>Servicio Web para InfoOnline TEST</wsdl:documentation>
  <wsdl:types>
    <xsd:schema>
<xsd:import namespace="http://ws.myProvider.org/" schemaLocation="InfoOnline.xsd"/>
</xsd:schema>
  </wsdl:types>
  <wsdl:message name="buscarInfoSoapOut">
    <wsdl:part name="buscarInfoResult" element="tns:buscarInfoResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="buscarInfoSoapIn">
    <wsdl:part name="parameters" element="tns:buscarInfo">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="InfoOnlineWSSoap">
    <wsdl:operation name="buscarInfo">
<wsdl:documentation>Solicita informacion para un paciente</wsdl:documentation>
      <wsdl:input message="tns:buscarInfoSoapIn">
    </wsdl:input>
      <wsdl:output message="tns:buscarInfoSoapOut">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="InfoOnlineWSSoap" type="tns:InfoOnlineWSSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="buscarInfo">
      <soap:operation soapAction="http://ws.myProvider.org/buscarHueco" style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="InfoOnlineWS">
<wsdl:documentation>Servicio Web Seguro  (Pruebas) para InfoOnline (TEST) </wsdl:documentation>
    <wsdl:port name="InfoOnlineWSSoap" binding="tns:InfoOnlineWSSoap">
      <soap:address location="https://urlprovider.com/services/SIU"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
**** SOAP client return error. method=buscarInfo, action=http://ws.myProvider.org/buscarInfo
     ERROR #6243: La solicitud HTTP a SOAP WebService ha devuelto una respuesta con CONTENT-TYPE inesperado: application/wsdl+xml.

Nota: Por motivos de confidencialidad, se ha modificado la dirección del proveedor y algunos detalles mas, pero esta es la respuesta obtenida.

He sobreescrito el método %OnSOAPResponse para ver si obtenía algo, y ya viene con el error

Method %OnSOAPResponse(mode As %String, client As %SOAP.WebClient, action As %String, oneWay As %Boolean, method As %String, requestStream As %BinaryStream, responseStream As %BinaryStream, sc As %Status)
{
Quit
}

entonces, no debería de ser un problema de la cabecera de salida, sino mas bién las cabeceras de entrada. ¿O es que intenta recuperar el WSDL para hacer la operación y ahí es donde está el problema?

Un saludo,
Kurro

Hola Alberto,

Si. Utilizando el log comprobé que está realizando la invocación correctamente y los datos se estaban enviando bien. Incluso he probado el mismo SOAP que había generado para probarlo con SoapUI y hacía la consulta correctamente.

Hola David,

No se donde se establece ese valor.

El Business Operation se creó usando el wizard y lo que se modificó en los métodos, es que antes de hacer el Invoke a cada uno de los métodos del WS, modifica el namespace y el Location según a que proveedor va a realizar la consulta.

Todos los proveedores tienne la misma estructura y métodos iguales, varían el Namespace y la URL.

He probado a incluir la siguiente linea:

Method MiMetodo(pRequest As MyMessageWS.RequestbuscarInfoRequest, Output pResponse As MyMessageWS.RequestbuscarInfoResponse) As %Library.Status
{
    do ..preparaOperacion(pRequest)
    Set tSC = ..Adapter.InvokeMethod("buscarInfo",.info,pRequest.idEspecialidad,pRequest.listaActos,pRequest.centroSanitario,pRequest.infoAdicional)
    Quit:$$$ISERR(tSC) tSC
    Set tSC = pRequest.NewResponse(.pResponse)  Quit:$$$ISERR(tSC) tSC
    Set pResponse.InfoCentro=$get(info)
    Quit $$$OK
}

Method preparaOperacion(pRequest As MyMessageWS.Request.base) As %Status
{
 Set ..Adapter.%Client.Namespace = pRequest.Namespace
 Set ..Adapter.%Client.Location = pRequest.Url
 Set ..Adapter.%Client.ContentType = "application/wsdl+xml"
 Quit $$$OK
}

He invocado al proveedor directamente para que me dé el WSDL y, efectivamente, responde con un fichero wsdl+xml

A ver si con esta explicación puedes ayudar mejor.

Un saludo,
Kurro

Si os gusta algún artículo, os animo a que voteis

Recordad que algunos artículos también se han traducido al español, el artículo al que hay que votar es el que está en el Community en inglés o directamente desde la el enlace del concurso.

Un saludo,
Kurro Lopez

Han sido mas o menos 10 concursos... como mucho serán 10, pero como también se dan el premio de la comunidad... me la juego ... 15 tiene el "supercode"