当前位置: 首页 > 知识库问答 >
问题:

Scala/Play:javax.xml.soap请求标题内容类型问题

狄子真
2023-03-14

在我的Scala/Play应用程序中,我有一个对SOAP API的简单调用:

import javax.xml.soap._


object API {


    def call = {

        val soapConnectionFactory = SOAPConnectionFactory.newInstance
        val soapConnection = soapConnectionFactory.createConnection

        val url = "http://123.123.123.123"

        val soapResponse = soapConnection.call(createSOAPRequest, url)

        soapConnection.close

    }


    def createSOAPRequest = {

        val messageFactory = MessageFactory.newInstance
        val soapMessage = messageFactory.createMessage
        val soapPart = soapMessage.getSOAPPart

        val serverURI = "http://some.thing.xsd/"

        val envelope = soapPart.getEnvelope
        envelope.addNamespaceDeclaration("ecl", serverURI)

        val soapBody = envelope.getBody
        val soapBodyElem = soapBody.addChildElement("TestRequest", "ecl")
        soapBodyElem.addChildElement("MessageID", "ecl").addTextNode("Valid Pricing Test")
        soapBodyElem.addChildElement("MessageDateTime", "ecl").addTextNode("2012-04-13T10:50:55")
        soapBodyElem.addChildElement("BusinessUnit", "ecl").addTextNode("CP")
        soapBodyElem.addChildElement("AccountNumber", "ecl").addTextNode("91327067")

        val headers = soapMessage.getMimeHeaders
        headers.setHeader("Content-Type", "application/json; charset=utf-8")
        headers.addHeader("SOAPAction", serverURI + "TestRequest")      
        headers.addHeader("Authorization", "Basic wfewefwefwefrgergregerg")

        println(headers.getHeader("Content-Type").toList)

        soapMessage.saveChanges

        soapMessage

    }

println输出我设置的右侧内容类型标题:

List(application/soap+xml; charset=utf-8)

但是我调用的远程SOAP API以415响应:

Bad Response; Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'.

我已经检查了用wireshark发送的请求,事实上,Content-Type标头是错误的:

Content-Type: text/xml; charset=utf-8

在这种情况下,为什么我设置的内容类型被忽略?我该如何修复它?

更新:我想我已经了解了一些事情:

SOAPPart对象是MIME部件,具有MIME头内容Id、内容位置和内容类型。因为内容类型的值必须是“text/xml”,所以SOAPPart对象自动具有内容类型的MIME头,其值设置为“text/xml”。该值必须为“text/xml”,因为消息的SOAP部分中的内容必须为xml格式。非“text/xml”类型的内容必须在AttachmentPart对象中,而不是在SOAPPart对象中。

来源

只需要找出如何更改我的代码来匹配它。

UPDATE2:SOLVED只需要更改1行以指示这是SOAP 1.2:

val messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL)

共有1个答案

陶成化
2023-03-14

只需更改1行,以指示这是SOAP 1.2,并自动设置右标题:

val messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL)
 类似资料:
  • 以下代码使用CORS协议完美地发送请求并接收响应。我想将内容类型标头更改为“应用程序/json”而不是“应用程序/x-www-form-urlencoded”。但是,当我将内容类型替换为“应用程序/json”时,请求失败。当我在浏览器中检查请求时,我可以看到内容类型标头已被删除而不是更改。 来自以上代码的请求 当“应用程序/x-web-form-urlencoded”被替换为“应用程序/json”

  • 我设置header的方式如下: 它为一些服务工作,但我在添加自定义头的需求基础,我面临的问题。 我不能使用“.contenttype()”在请求中设置header,因为headersmap中动态设置的header的数量是可变的。

  • 下面是我的Ajax请求: 如果我没有精确的内容类型,我就无法再看到Firebug的请求。相反,当我添加内容类型时,我可以看到POST请求(由于我的URL是false而出现错误),但在我的头中,内容类型默认是URL编码的表单。 我想要的是通过JSON数据发送表单的详细信息。谢谢你的帮助

  • 我有一个支持json和XML的REST api。我想测试XML方面,但自从升级到2.4.0版本后,我得到了一个错误: 预期的内容类型“xml”与实际的内容类型“application/json”不匹配。

  • 我试图使用服务/调度机制发布一个JAX-RS资源。问题是传出请求的内容类型被锁定为。我看不出有什么方法可以将其更改为其他类型,例如。 RESTful webservice只使用和。这是我使用的代码: 接受标头被修改为zoo标头,foo标头添加了值,但Content-Type保持不变。我想我可以使用一个过滤器,并根据一些条件修改,甚至基于foo头,但这似乎违反直觉。 以下是请求的所有标题: 感谢您的

  • 本文向大家介绍docker容器内网络请求缓慢问题解决,包括了docker容器内网络请求缓慢问题解决的使用技巧和注意事项,需要的朋友参考一下 在使用docker的过程中发现了几个问题,在docker里进行的网络请求经常会失败,比如npm install以及bundle install等操作,或者是作为中间层在应用中去获取api数据的过程经常会出现timeout等情况,所以开始探究docker的网络机