RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-500665

Arsusen's questions

Martin Hope
Arsusen
Asked: 2023-11-03 02:25:35 +0000 UTC

如何从 SOAP 请求中获取字符串

  • 5

实际上是什么问题,我向Web服务Web服务发出了POST请求并收到了响应

要求

--> POST https://www.dataaccess.com/webservicesserver/NumberConversion.wso
Content-Type: text/xml
Content-Length: 247
Accept-Charset: utf-8
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <NumberToWords xmlns="http://www.dataaccess.com/webservicesserver/">
         <ubiNum>1000</ubiNum>
      </NumberToWords>
   </soap:Body>
</soap:Envelope>
--> END POST (247-byte body)

回答

<-- 200 https://www.dataaccess.com/webservicesserver/NumberConversion.wso (1333ms)
cache-control: private, max-age=0
content-type: text/xml; charset=utf-8
vary: Accept-Encoding
server: Server
web-service: DataFlex 19.1
x-powered-by: ASP.NET
date: Thu, 02 Nov 2023 15:52:53 GMT
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <m:NumberToWordsResponse xmlns:m="http://www.dataaccess.com/webservicesserver/">
      <m:NumberToWordsResult>one thousand</m:NumberToWordsResult>
    </m:NumberToWordsResponse>
  </soap:Body>
</soap:Envelope>
<-- END HTTP (344-byte body)

从这个答案中我想得到“一千”我该怎么做?

代码接口

import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST


interface soapAPI {

    @Headers(
        "Content-Type: text/xml",
        "Accept-Charset: utf-8"
    )
    @POST("webservicesserver/NumberConversion.wso")
    suspend fun sendApi(@Body envelope: SoapEnvelope): Response<output>
}

请求代码

import org.simpleframework.xml.Element
import org.simpleframework.xml.Namespace
import org.simpleframework.xml.Root

@Namespace(prefix = "soap", reference = "http://schemas.xmlsoap.org/soap/envelope/")
@Root(name = "Envelope")
data class SoapEnvelope(
    @field:Element(name = "soap:Body", required = false)
    var body: SoapBody? = null
)

@Root(name = "soap:Body", strict = false)
data class SoapBody(
    @field:Element(name = "NumberToWords")
    var numberToWords: NumberToWords? = null
)

@Root(name = "NumberToWords", strict = false)
@Namespace(reference = "http://www.dataaccess.com/webservicesserver/")
data class NumberToWords(
    @field:Element(name = "ubiNum", required = false)
    var ubiNum: String? = null
)

用于获取答案的数据类(可能这是我的代码的弱点)

data class output(
    val ubiNum: String
)

改造2、okHttp3、simpleXML

val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        val client = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl("https://www.dataaccess.com/")
            .client(client)
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build()

        val productApi = retrofit.create(soapAPI::class.java)

        CoroutineScope(Dispatchers.IO).launch {
            val envelope = SoapEnvelope(
                body = SoapBody(
                    numberToWords = NumberToWords("1000")
                )
            )
            Log.d("check", "перед ошибкой")
            val response = productApi.sendApi(envelope)
            Log.d("check", "после ошибки") //это не выполняется
            if (response.isSuccessful){
                val output = response.body()
                Log.d("check", "${output}") 
            }
            else {
                val errorBody = response.errorBody()
                Log.d("check", "ошибка")// выполняется если неправильный запрос
            }
        }

当代码 200 发生致命错误并且应用程序崩溃时

FATAL EXCEPTION: DefaultDispatcher-worker-1
Process: com.example.myapplication, PID: 10024
java.lang.RuntimeException: org.simpleframework.xml.core.ElementException: Element 'Body' does not have a match in class com.example.myapplication.output at line -1
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:45)
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:23)
    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
    at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
    at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
    at java.lang.Thread.run(Thread.java:1012)
    Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@a4ec63, Dispatchers.IO]
Caused by: org.simpleframework.xml.core.ElementException: Element 'Body' does not have a match in class com.example.myapplication.output at line -1
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:527)
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445)
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59)
    at org.simpleframework.xml.core.Composite$Injector.read(Composite.java:1433)
    at org.simpleframework.xml.core.Composite.read(Composite.java:201)
    at org.simpleframework.xml.core.Composite.read(Composite.java:148)
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
    at org.simpleframework.xml.core.Persister.read(Persister.java:625)
    at org.simpleframework.xml.core.Persister.read(Persister.java:606)
    at org.simpleframework.xml.core.Persister.read(Persister.java:584)
    at org.simpleframework.xml.core.Persister.read(Persister.java:562)
    at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:37)

不要严格评判,我是第一次做这样的事情,很多东西还是不明白,还想请教一下哪里可以得到这方面的资料,谢谢。

xml
  • 1 个回答
  • 24 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5