简单对象访问协议(SOAP)是用于在Web服务的实现中交换结构化信息的协议规范。
我正在尝试创建一个使用 WSDL 文件并生成正确的 SOAP 消息的客户端。 这就是我创建客户端的方式: 客户 = 客户( wsdl=wsdl ,运输=运输 ...
如何在 PHP 7.0 Ubuntu 18.10 中启用 SoapClient
我使用 PHP 7.0 Ubuntu 18.10,我无法在 phpinfo() 中启用模块 SoapClient。 我已经删除了“;”在我的 php.ini 配置中并重新启动 apache2 以启用soap模块。
在Postman中将WSDL导入到新的Collection中({Collection} > Import > Link > Url)后,是否有办法在API修改时更新或刷新Collection的请求? 我已经
MS_MAX_CONCURRENT_REQ - VIES 增值税验证
我想使用 https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 确认多个地址。 由于某种原因,我不断收到 MS_MAX_CONCURRENT_REQ 错误。我明白意思了...
我们在 AWS 中的大多数定制应用程序都是容器化的 .NET Core 应用程序,到目前为止,我们不需要构建任何 SOAP API - 几乎我们已交付的所有 API(无论是公开的...
我有一种情况,我需要从 SOAP 响应中过滤某些 XML 节点,我使用了 XSLT 映射,但它没有从 SOAP 响应中过滤特定的 xml 节点,我的要求是有 xml 节点...
如何使用 DLNA 浏览 Synology NAS 上的目录?
GET http://192.168.1.5:50001/desc/device.xml 返回以下数据: GET http://192.168.1.5:50001/desc/device.xml 返回以下数据: <?xml version="1.0" encoding="utf-8"?> <root xmlns="urn:schemas-upnp-org:device-1-0"> <specVersion> <major>1</major> <minor>0</minor> </specVersion> <device> <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType> <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMS-1.50</dlna:X_DLNADOC> <friendlyName>MY-NAS</friendlyName> <manufacturer>Synology Inc</manufacturer> <manufacturerURL>http://www.synology.com/</manufacturerURL> <modelDescription>Synology DLNA/UPnP Media Server</modelDescription> <modelName>DS210j</modelName> <modelURL>http://www.synology.com/</modelURL> <serialNumber>A2G6N03829</serialNumber> <UDN>uuid:00113206-3dd5-0011-d53d-d53d01234567</UDN> <presentationURL>http://192.168.1.5:5000/</presentationURL> <iconList> <icon> <mimetype>image/jpeg</mimetype> <width>120</width> <height>120</height> <depth>24</depth> <url>/tmp_icon/dmsicon120.jpg</url> </icon> <!-- 3 more icons here --> </iconList> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType> <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId> <SCPDURL>/connmgrSCPD.xml</SCPDURL> <controlURL>/ConnectionManager/control</controlURL> <eventSubURL>/ConnectionManager/event</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType> <serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId> <SCPDURL>/cdsSCPD.xml</SCPDURL> <controlURL>/ContentDirectory/control</controlURL> <eventSubURL>/ContentDirectory/event</eventSubURL> </service> <service> <serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1</serviceType> <serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId> <SCPDURL>/msrrSCPD.xml</SCPDURL> <eventSubURL>/MediaReceiverRegistrar/event</eventSubURL> <controlURL>/MediaReceiverRegistrar/control</controlURL> </service> </serviceList> </device> </root> 当我尝试执行以下请求时: curl --location 'http://192.168.1.5:50001/ContentDirectory/control' \ --header 'SOAPAction: urn:schemas-upnp-org:service:ContentDirectory:1#Browse' \ --header 'Content-Type: text/xml; charset="utf-8"' \ --data '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1"> <ObjectID>0</ObjectID> <BrowseFlag>BrowseDirectChildren</BrowseFlag> <Filter>*</Filter> <StartingIndex>0</StartingIndex> <RequestedCount>1000</RequestedCount> <SortCriteria></SortCriteria> </u:Browse> </s:Body> </s:Envelope> 我收到错误代码-111: Invalid Action。这里有什么问题吗? 我尝试从操作中删除 #Browse 并仅发送 #Browse - 这没有帮助。 根据服务器回复,Synology 使用 Linux/2.6.32.12, UPnP/1.0, Portable SDK for UPnP devices/1.6.18。 根据 UPnP 设备架构规范第 3.2 节,调用操作的标头如下所示 POST path of control URL HTTP/1.1 HOST: host of control URL:port of control URL CONTENT-LENGTH: bytes in body CONTENT-TYPE: text/xml; charset="utf-8" SOAPACTION: "urn:schemas-upnp-org:service:serviceType:v#actionName" 所需的 HTTP 方法是 POST;你的命令没有设置这个。 我对curl不太熟悉,但认为添加-X POST可能会达到你想要的效果。
发送请求时如何强制 JAXB 写入 javax.jws.WebParam 的 xsi:type(CXF 实现)
我在wsdl上使用wsdl2java生成了类,服务接口如下所示 @WebService(targetNamespace = "http://www.sii.example.it/SWG1", name = "SWG1") @XmlSeeAlso({it.au.switchgas....
我们正在从 Axis-2 迁移到 CXF,并尝试获得类似的响应。 Axis-2 对肥皂请求的响应 我们正在从 Axis-2 迁移到 CXF,并尝试获得类似的响应。 Axis-2 对肥皂请求的响应 <?xml version="1.0" ?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <loginResponse xmlns="urn:TestWebAPI"> <loginReturn xmlns="">9876</loginReturn> </loginResponse> </soapenv:Body> </soapenv:Envelope> 迁移后CXF响应: <?xml version="1.0" ?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:loginResponse xmlns:ns1="urn:TestWebAPI"> <loginReturn xmlns:ns2="urn:TestWebAPI">9876</loginReturn> </ns1:loginResponse> </soap:Body> </soap:Envelope> 如何使 CXF 响应类似于 Axis-2 响应? 修改 SOAP 前缀 CXF 提供了一个属性 “soap.env.ns.map” 来修改soap响应的前缀。 import org.apache.cxf.binding.soap.Soap11; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import java.util.HashMap; import java.util.Map; public class SoapResponsePrefixInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String soapEnvelopePrefix; public SoapResponsePrefixInterceptor(String soapPrefix) { super(Phase.PREPARE_SEND); soapEnvelopePrefix = soapPrefix; } @Override public void handleMessage(SoapMessage message) { Map<String, String> envelopeNSMap = new HashMap<>(); envelopeNSMap.put(soapEnvelopePrefix, Soap11.SOAP_NAMESPACE); // "http://schemas.xmlsoap.org/soap/envelope/" message.put("soap.env.ns.map", envelopeNSMap); message.put(AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION, Boolean.TRUE); } } 包含此类作为out拦截器,以修改soap前缀。 SoapResponsePrefixInterceptor responsePrefixInterceptor = new SoapResponsePrefixInterceptor("soapenv"); factoryBean.getOutInterceptors().add(responsePrefixInterceptor); factoryBean.getOutFaultInterceptors().add(responsePrefixInterceptor); 其逻辑实现于 SoapOutInterceptor.writeSoapEnvelopeStart()。 hasAdditionalEnvNs() 检查应用程序是否配置了任何自定义信封名称 空格并替换为配置的值。 修改或删除命名空间 CXF提供了变压器功能,可以帮助我们修改命名空间。 private Feature getTransformer() { StaxTransformFeature staxFeature = new StaxTransformFeature(); Map<String, String> replaceElements = new HashMap<>(); // value between braces is used as namespace, followed by localName. replaceElements.put('{' + DEFAULT_NAMESPACE + "}*", ""); staxFeature.setOutTransformElements(replaceElements); staxFeature.setOutDefaultNamespace(DEFAULT_NAMESPACE); return staxFeature; } 将此变压器作为一项功能添加到工厂 bean 中。 fb.setFeatures(List.of(getTransformer())); TransformOutInterceptor.createTransformWriterIfNeeded() - 如果设置了任何值,则创建变压器。 RPCOutInterceptor.addOperationNode() > StaxUtils.writeStartElement() > OutTransformWriter.writeStartElement() > OutTransformWriter.write() - 根据转换器修改响应。 同样的逻辑存在于 OutTransformWriter() > TransformUtils.convertToQNamesMap() > DOMUtils.convertStringToQName()
Siebel 错误:入站 SOAP 消息 XML 解析在第 2 行和第 1 列失败
我正在使用 SoapUI 将带有 MTOM 文件附件的 SOAP 请求发送到 Oracle Siebel 应用程序,但收到此错误: 错误:入站 SOAP 消息 - XML 解析在第 2 行和
org.apache.cxf.binding.soap.SoapFault:证书路径验证期间出错:路径不与任何信任锚链接
我正在创建一个 Web 服务客户端来连接到服务。我按照以下步骤使用证书身份验证创建并连接到服务 从
所以我不是一个很好的网络人,所以我希望有人能给我指出正确的方向,以找出我做错了什么。 我正在尝试使用curl 来发布SOAP 消息。 我跑了...
使用 Angular 通过 HTTP 发送 SOAP 请求?
我正在使用简单的 HTML、CSS 和 Angular 开始一个新的 Web 应用程序项目。我们正在使用现有的 Web 服务从某些服务器检索数据,我们尝试使用的一项服务是公共服务...
带有大消息的 JAX-WS SoapHandler:OutOfMemoryError
使用 JAX-WS 2,我看到其他人也谈到过的一个问题。问题是,如果在处理程序内接收到 SOAP 消息,并且该 SOAP 消息很大 - 是否由于内联 SOAP ...
我试图通过 Visual Studio 生成的一些代理代码(基于服务中的 WSDL)调用外部 Web 服务。我返回的结果对象为空,尽管我可以看到
使用 gradle、框架 Micronaut、技术 kotlin 创建 SOAP Web 服务
第一次使用Micronaut(gradle)构建SOAP服务,网上查到的资料不是太多。所有路径都引导我到这些库: 实施(“com.sun...
我正在尝试从以下来自 salesforce 的字符串响应中获取标签值, 我正在尝试从以下来自 salesforce 的字符串响应中获取标签值, <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://soap.sforce.com/2006/04/metadata"> <soapenv:Body> <listMetadataResponse> <result> <createdById>00528000001m5RRAAY</createdById> <createdByName>Hariprasath Thanarajah</createdByName> <createdDate>1970-01-01T00:00:00.000Z</createdDate> <fileName>objects/EmailMessage.object</fileName> <fullName>EmailMessage</fullName> <id /> <lastModifiedById>00528000001m5RRAAY</lastModifiedById> <lastModifiedByName>Hariprasath Thanarajah</lastModifiedByName> <lastModifiedDate>1970-01-01T00:00:00.000Z</lastModifiedDate> <namespacePrefix /> <type>CustomObject</type> </result> </listMetadataResponse> </soapenv:Body> </soapenv:Envelope> 上面我们有标签<fullName>。我需要获取标签内的值并将其放入字符串数组中。我尝试过使用 substring 方法,但它只返回一个值。有人可以建议我这样做吗? 我已经尝试过如下, public static Document loadXMLString(String response) throws Exception { DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(new StringReader(response)); return db.parse(is); } public static List<String> getFullNameFromXml(String response, String tagName) throws Exception { Document xmlDoc = loadXMLString(response); NodeList nodeList = xmlDoc.getElementsByTagName(tagName); List<String> ids = new ArrayList<String>(nodeList.getLength()); for(int i=0;i<nodeList.getLength(); i++) { Node x = nodeList.item(i); ids.add(x.getFirstChild().getNodeValue()); System.out.println(nodeList.item(i).getFirstChild().getNodeValue()); } return ids; } 从上面的代码中,您将获得 ids 列表。之后,您可以将它们放入字符串数组并将它们返回到字符串数组,如下所示, List<String> output = getFullNameFromXml(response, "fullName"); String[] strarray = new String[output.size()]; output.toArray(strarray); System.out.print("Response Array is "+Arrays.toString(strarray)); 使用以下代码解析 SOAP 响应并获取元素值。 将 XML 响应保存在系统上的任何位置。调用方法 getResult()。它是一个通用方法。它采用 Web 服务响应的有效负载类类型并返回 java 对象。 private static String readXMLFile(String fileName) { File xmlFile = new File("response file path from step 1"); Reader fileReader = new FileReader(xmlFile); BufferedReader bufReader = new BufferedReader(fileReader); StringBuilder sb = new StringBuilder(); String line = bufReader.readLine(); while (line != null) { sb.append(line).append("\n"); line = bufReader.readLine(); } String xml2String = sb.toString(); bufReader.close(); } public <T> T getResult(String xml, String path, Class<T> type) { final Node soapBody = getSoapBody(xml, path); return getInstance(soapBody, type); } private Node getSoapBody(String xml, String path) { try { SOAPMessage message = getSoapMessage(xml, path); Node firstElement = getFirstElement(message); return firstElement; } catch (Exception e) { throw new RuntimeException(e); } } private SOAPMessage getSoapMessage(String xml, String path) throws SOAPException, IOException { MessageFactory factory = MessageFactory.newInstance(); FileInputStream fis = new FileInputStream(path); BufferedInputStream inputStream = new BufferedInputStream(fis); return factory.createMessage(new MimeHeaders(), inputStream); } private Node getFirstElement(SOAPMessage message) throws SOAPException { final NodeList childNodes = message.getSOAPBody().getChildNodes(); Node firstElement = null; for (int i = 0; i < childNodes.getLength(); i++) { if (childNodes.item(i) instanceof Element) { firstElement = childNodes.item(i); break; } } return firstElement; } private <T> T getInstance(Node body, Class<T> type) { try { JAXBContext jc = JAXBContext.newInstance(type); Unmarshaller u = jc.createUnmarshaller(); return (T) u.unmarshal(body); } catch (JAXBException e) { throw new RuntimeException(e); } } 如果您只想解析这个单个元素,您可以使用 SAX 或 StAX 解析器,如此处所述 https://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax- parser-in-java.html. SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean fullName = false; public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException { System.out.println("Start Element :" + qName); if (qName.equals("fullName")) { fullName = true; } } public void characters(char ch[], int start, int length) throws SAXException { if (fullName ) { System.out.println("Full Name : " + new String(ch, start, length)); fullName = false; } } } saxParser.parse(mySoapResponse, handler); 或者您可能想阅读有关 JAX-WS API 的更多信息,以创建 SOAP 客户端以使用 Salesforce Web 服务。
SOAP Office.js EWS ReplyView getAttachments
我想生成一个 SOAP 请求来下载我正在回复的电子邮件的附件(所以我在 MessageComposeCommandSurface 中,而不是在 MessageReadCommandSurface 中,我知道会有一个 AP...
我正在使用 xmlsec1 工具和 XML 数字签名 (XMLDSIG) 标准对 SOAP 信封进行签名。这是我正在使用的未签名的 SOAP 信封。 我正在使用 xmlsec1 工具和 XML 数字签名 (XMLDSIG) 标准对 SOAP 信封进行签名。这是我正在使用的未签名 SOAP 信封。 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue /> </Reference> </SignedInfo> <SignatureValue /> <KeyInfo> <X509Data /> </KeyInfo> </Signature> <soapenv:Body>This is the body of the SOAP envelope</soapenv:Body> </soapenv:Envelope> 我使用以下 xmlsec1 命令生成了签名信封。 xmlsec1 --sign --privkey-pem private_key.pem --output signed_test.xml test.xml 生成的签名信封如下 <?xml version="1.0"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>mT/qq9iX2rvTrWOPfE8thFOKdbA=</DigestValue> </Reference> </SignedInfo> <SignatureValue>eZFngILLORe+r/07FupC9YPJEB3n3qhTyEi0+3J7Ivv/20rm7YNU5CllAiUmLUDJ 0A9/YLDo2BOokrNmAkpWtxU1xs83FH3NDecfqEj1hgIXsbkMhJLh2szssR6nRoff ZV8FqWjQgUGS/IKLY0R9S/pxMxROKkiJ0J71hFHvuFphN/ZtpOGXdmX7oaS6EZmT BeSu8R2jGiMVbGyf4+EBxkpSN6VF4tn3MWgfP+MV7ICw3MHHgNVd7Nqy7vS+kOtZ hq2Tndg4b7O79XW2ni5tmpKJzHPDBfWFS+fEXHqkOFcPnb1rCk3oTOcaCqHOVZ1m BbiB7r2bxyrKDL7uIA4suw==</SignatureValue> <KeyInfo> <X509Data/> </KeyInfo> </Signature> <soapenv:Body>This is the body of the SOAP envelope</soapenv:Body> </soapenv:Envelope> 我试图理解 和 是如何计算的。根据 SOAP 信封,我知道的是: DigestValue 使用 SHA-1 算法,如元素中所指定。 SignatureValue 使用 RSA-SHA1 算法生成,如元素中所指定。 当我使用 <soap:Body> 算法对 sha1 进行哈希处理时,我得到了不同的值。如果有人可以展示正确生成这些值的详细步骤,我们将不胜感激。 我在这个 github 存储库中检查了 xmlsec 的代码:https://github.com/lsh123/xmlsec我认为这是正确的。 我对C和密码学的了解很差,所以我无法直接向你解释。 但是通过在整个项目中搜索“SignatureValue”,我在第805行找到了这个文件https://github.com/lsh123/xmlsec/blob/master/src/gcrypt/signatures.c#L805,其中解释 SignatureValue 基于 DSA-SHA1 的评论,这里是: DSA-SHA1 signature transform http://www.w3.org/TR/xmldsig-core/#sec-SignatureAlg: The output of the DSA algorithm consists of a pair of integers usually referred by the pair (r, s). The signature value consists of the base64 encoding of the concatenation of two octet-streams that respectively result from the octet-encoding of the values r and s in that order. Integer to octet-stream conversion must be done according to the I2OSP operation defined in the RFC 2437 [PKCS1] specification with a l parameter equal to 20. For example, the SignatureValue element for a DSA signature (r, s) with values specified in hexadecimal: r = 8BAC1AB6 6410435C B7181F95 B16AB97C 92B341C0 s = 41E2345F 1F56DF24 58F426D1 55B4BA2D B6DCD8C8 from the example in Appendix 5 of the DSS standard would be <SignatureValue>i6watmQQQ1y3GB+VsWq5fJKzQcBB4jRfH1bfJFj0JtFVtLotttzYyA==</SignatureValue> 希望它可以帮助您找到您想要的东西。