微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Kotlin 调用 .svc 时,org.ksoap2.transport.HttpResponseException 400 错误请求错误

如何解决从 Kotlin 调用 .svc 时,org.ksoap2.transport.HttpResponseException 400 错误请求错误

我看过其他帖子,但似乎没有帮助。问题似乎是将参数添加到请求中。请注意,这是一个 .svc —— 不是 wsdl。 C# .svc 文件具有以下数据协定:

[DataContract]
public class MyMethod_In
{
    [DataMember]
    public string rc;
}

Kotlin 代码:(常量取出方便阅读,改名以保护无辜)

    val soapObject = SoapObject("https://qa.mysite.com/ws/MyService.svc/","MyMethod")
    soapObject.addProperty("rc","xyz")
    val envelope = SoapSerializationEnvelope(SoapEnvelope.VER11)
    envelope.setoutputSoapObject(soapObject)
    envelope.dotNet = true
    val httpTransport = HttpTransportSE("https://qa.mysite.com/ws/MyService.svc/MyMethod")

try {
    httpTransport.call("https://qa.mysite.com/ws/MyService.svc/MyMethod",envelope)
    blah blah
}
    catch (e: Exception) {
    exception happens with 400 error
}

问题似乎出在 soapObject.addProperty 行上。我还尝试了其他代码,在其中构建属性信息并设置名称、类型和值,但我仍然总是收到 400 错误。我尝试使用一种类型的字符串和一种类型的 JSON,但没有任何区别。

我不完全确定某些硬编码值,但我似乎正确地调用了该服务,因为我尝试了另一个没有输入参数的服务,这运行良好并得到了响应。

我可能遗漏了一件小事,但找不到。关于为什么错误请求的任何想法?谢谢

解决方法

为 okhttp3,版本 4.2.0 解决了这个问题。正如我所怀疑的,我需要传递 JSON 数据。这段代码做到了:

val json = "{ \"rc\":\"xyz\" }"
val mediaTypeJson = "application/json; charset=utf-8".toMediaType()
val requestBody = json.toString().toRequestBody(mediaTypeJson)

val request = Request.Builder()
    .url("https://qa.mysite.com/ws/MyService.svc/MyMethod")
    .post(requestBody)
    .build()

可能应该清理它并使用 gson 或其他东西,但至少这是有效的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。