从 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 或其他东西,但至少这是有效的。