gpt4 book ai didi

php - Android 使用 ksoap 调用 PHP SOAP webservice 失败 : 'procedure ' CheckLogin' not found

转载 作者:行者123 更新时间:2023-11-30 03:56:45 25 4
gpt4 key购买 nike

我正在尝试调用 PHP SOAP 网络服务。我知道我的 web 服务功能正常,因为我在 WPF 项目中成功地使用了它。我还在 android 中构建一个应用程序,使用相同的网络服务。

WSDL 文件可以在这里找到:http://www.wegotcha.nl/servicehandler/service.wsdl

这是我在 android 应用程序中的代码:

String SOAP_ACTION = "http://www.wegotcha.nl/servicehandler/CheckLogin";
String NAMESPACE = "http://www.wegotcha.nl/servicehandler";
String METHOD_NAME = "CheckLogin";
String URL = "http://www.wegotcha.nl/servicehandler/servicehandler.php";
String resultData = "";

SoapSerializationEnvelope soapEnv = new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

SoapObject UserCredentials = new SoapObject("Types", "UserCredentials6");
UserCredentials.addProperty("mail", params[0]);
UserCredentials.addProperty("password", md5(params[1]));

request.addSoapObject(UserCredentials);
soapEnv.setOutputSoapObject(request);

HttpTransportSE http = new HttpTransportSE(URL);
http.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
http.debug = true;

try {
http.call(SOAP_ACTION, soapEnv);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}

SoapObject results = null;
results = (SoapObject)soapEnv.bodyOut;

if(results != null)
resultData = results.getProperty(0).toString();

return resultData;

使用 fiddler 我得到了以下信息:安卓请求:

<?xml version="1.0" encoding="utf-8"?>
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header />
<v:Body>
<n0:CheckLogin id="o0" c:root="1" xmlns:n0="http://www.wegotcha.nl/servicehandler">
<n1:UserCredentials6 i:type="n1:UserCredentials6" xmlns:n1="Types">
<mail i:type="d:string">myemail</mail>
<password i:type="d:string">myhashedpass</password>
</n1:UserCredentials6>
</n0:CheckLogin>
</v:Body>
</v:Envelope>

得到以下响应:

 Procedure 'CheckLogin' not present

我的 WPF 应用程序生成的请求看起来完全不同:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserCredentials6 xmlns="Types">
<mail>mymail</mail>
<password>mypassword</password>
</UserCredentials6>
</s:Body>
</s:Envelope>

在谷歌搜索之后,我无法自己解决这个问题。我的 Java 代码中可能有一些奇怪的东西,因为我改变了很多。我希望你们能帮助我,谢谢。

编辑:

我的网络服务是文档/文字编码风格,经过一些研究我发现我应该能够使用 SoepEnvelope 而不是 SoapSerializationEnvelope 虽然当我替换它时我得到try 缓存 block 之前的错误,导致我的应用程序崩溃。

错误:

11-04 16:23:26.786: E/AndroidRuntime(26447): Caused by: java.lang.ClassCastException: org.ksoap2.serialization.SoapObject cannot be cast to org.kxml2.kdom.Node

这是由这些行引起的:

request.addSoapObject(UserCredentials);
soapEnv.setOutputSoapObject(request);

虽然这可能是一个解决方案,但我该怎么做呢?除了这个很棒的教程之外,我没有发现任何关于使用 SoapEnvelope 而不是 SoapSerializationEnvelope 的信息:

http://ksoap.objectweb.org/project/mailingLists/ksoap/msg00849.html

最佳答案

刚刚发生了一些奇怪的事情。我只是删除了 a 行(我做了数千次)调整了其余部分,因为我遇到了一些新错误并且我得到了以下代码:

String SOAP_ACTION = "http://www.wegotcha.nl/servicehandler/CheckLogin";
String NAMESPACE = "http://www.wegotcha.nl/servicehandler";
String METHOD_NAME = "CheckLogin";
String URL = "http://www.wegotcha.nl/servicehandler/servicehandler.php";
String resultData = "";

SoapSerializationEnvelope soapEnv = new SoapSerializationEnvelope(SoapEnvelope.VER11);

SoapObject UserCredentials = new SoapObject("Types", "UserCredentials6");
UserCredentials.addProperty("mail", params[0]);
UserCredentials.addProperty("password", md5(params[1]));

// changed these lines
// request.addSoapObject(UserCredentials);
// soapEnv.setOutputSoapObject(request);
// into:
soapEnv.setOutputSoapObject(UserCredentials);

HttpTransportSE http = new HttpTransportSE(URL);
http.debug = true;

// little tweak here
String results = null;
try {
http.call(SOAP_ACTION, soapEnv);
//another tweak here
results = soapEnv.bodyIn.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}

if(results != null)
resultData = results;

return resultData;

现在我可以正确登录 :) 它们不是非常实用的变通办法,因为这是唯一一个我会回复是或否的地方。想想复杂类型的数组等等。但那是另一回事了。

关于php - Android 使用 ksoap 调用 PHP SOAP webservice 失败 : 'procedure ' CheckLogin' not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13218942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com