Android 解决Webservice问题时需要帮助

Android 解决Webservice问题时需要帮助,android,soap,salesforce,Android,Soap,Salesforce,嗨,我正在尝试通过Android平台上的Web服务登录salesforce。但我面临一些问题。我收到一个“套接字异常:操作超时”错误。我正在使用为Android移植的Ksoap2 soap cient,WSDL详细信息来自我在Salesforce的开发人员帐户的合作伙伴WSDL。我已经分析了“api访问”。此外,用户名和密码也是有效的。我正在Android桌面仿真器上通过开发环境(Eclipse)进行尝试。 谁能帮我找出我是否遗漏了什么并解决这个问题。 以下是源代码: import androi

嗨,我正在尝试通过Android平台上的Web服务登录salesforce。但我面临一些问题。我收到一个“套接字异常:操作超时”错误。我正在使用为Android移植的Ksoap2 soap cient,WSDL详细信息来自我在Salesforce的开发人员帐户的合作伙伴WSDL。我已经分析了“api访问”。此外,用户名和密码也是有效的。我正在Android桌面仿真器上通过开发环境(Eclipse)进行尝试。
谁能帮我找出我是否遗漏了什么并解决这个问题。
以下是源代码:

import android.app.Activity;
//Soap imports
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

//Android Imports
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import org.xmlpull.v1.*;
import java.io.IOException;


import android.os.Bundle;

public class SalesForceLogin extends Activity 
{
    private static final String NAMESPACE = "urn:sobject.partner.soap.sforce.com";
    private static final String URL = "https://login.salesforce.com/services/Soap/c/20.0";
    private static final String SOAP_ACTION = "";
    private static final String TAG = "SALESFORCE-SERVICE";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //New
        SoapObject binding = new SoapObject(NAMESPACE, "login");
        binding.addProperty("username", "username"); //Valid username
        binding.addProperty("password", "password"); //Valid password appended by security token
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(binding);
        AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
        androidHttpTransport.debug = true; 
        SoapObject result=null;
        try 
        {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            result = (SoapObject)envelope.getResponse();
            // At this point, Soap login success.
            Log.v(TAG, result.toString());
            Object serverUrl=result.getProperty("serverUrl");
            Log.v(TAG,"serverUrl="+serverUrl);
            Object passwordExpired=result.getProperty("passwordExpired");
            Log.v(TAG,"passwordExpired="+passwordExpired); 
            Log.v(TAG, "Ending Login with Success.");

        } 
        catch (SoapFault aSoapFault) 
        {
            Log.d(TAG, "SoapFault actor="+aSoapFault.faultactor);
            Log.d(TAG, "SoapFault code="+aSoapFault.faultcode);
            Log.d(TAG, "SoapFault message="+aSoapFault.faultstring);
            // do something – Soap Fault occurred
        }
        catch (XmlPullParserException reso)
        {
            Log.v(TAG, "XmlPullParserException");
            reso.printStackTrace();
        }
        catch (IOException reso) //Socket Exception caught here!
        {
            Log.v(TAG, "IOException");
            reso.printStackTrace();
        }

    }
}
编辑:对于引用此线程的任何人,我能够运行上述web服务,问题是url和命名空间之间存在差异。经过以下修改,上述代码运行得非常好

NAMESPACE = "urn:partner.soap.sforce.com";
URL = "https://login.salesforce.com/services/Soap/u/20.0";
SOAP_ACTION = "soap";

我有一些在.NET Web服务中使用Ksoap2 Android的经验,我能告诉你的第一件事是,它们充其量也很难。我祈祷谷歌将来能成为一个本地soap客户端

至于您的问题,在不了解web服务的详细信息的情况下,很难说什么是错误的。SocketException可以在套接字创建或设置选项期间抛出(请参阅)。很可能您使用了错误的URL或命名空间

我还建议您使用数据包嗅探器(wireshark很适合这样做),这样您就可以看到您的soap请求实际上是什么样子的。然后,您可以将其与服务期望的内容进行比较,并从那里对其进行微调


祝你好运!如果我能提供更多帮助,请告诉我。

我有一些使用Ksoap2 Android for.NET Web服务的经验,我能告诉你的第一件事是,它们充其量也很难。我祈祷谷歌将来能成为一个本地soap客户端

至于您的问题,在不了解web服务的详细信息的情况下,很难说什么是错误的。SocketException可以在套接字创建或设置选项期间抛出(请参阅)。很可能您使用了错误的URL或命名空间

我还建议您使用数据包嗅探器(wireshark很适合这样做),这样您就可以看到您的soap请求实际上是什么样子的。然后,您可以将其与服务期望的内容进行比较,并从那里对其进行微调



祝你好运!让我知道我是否可以帮助解决更多路由问题?(即端口转发、代理、防火墙等)

可能存在路由问题?(即端口转发、代理、防火墙等)

感谢您提供的快速信息,我将与wireshark一起查看流量。我只是浏览了一下这个问题,还发现系统代理设置不适用于普通套接字,而且我确实使用了代理,所以will将首先在没有代理的情况下进行检查,我是Webservices新手,所以可能我误读了WSDL的参数。如果您能提供帮助,我可能会发布WSDL相关部分。@als:您是否签入了proxyless服务器?它起作用了吗?我也面临着同样的问题感谢你的快速信息,我将与wireshark一起查看流量。我只是浏览了一下这个问题,还发现系统代理设置不适用于普通套接字,而且我确实使用了代理,所以will将首先在没有代理的情况下进行检查,我是Webservices新手,所以可能我误读了WSDL的参数。如果您能提供帮助,我可能会发布WSDL相关部分。@als:您是否签入了proxyless服务器?它起作用了吗?我也面临着同样的问题,这正是我现在的感受。我将首先在proxyless桌面上试用。它将更新结果。是的,那些路由问题确实会让人头疼,而且会浪费时间。@als:您签入proxyless服务器了吗?它起作用了吗?我也面临同样的问题problem@Adhavan:我能够解决问题,这不是代理或防火墙的问题。名称空间和url之间存在差异。检查WSDL并确保命名空间和url之间没有差异,这是此类场景中最常见的问题。检查编辑:在问题中,它给出了我必须进行的修改。@all:我真的有一些问题是代理。。。我现在觉得有个解决办法。我将首先在proxyless桌面上试用。它将更新结果。是的,那些路由问题确实会让人头疼,而且会浪费时间。@als:您签入proxyless服务器了吗?它起作用了吗?我也面临同样的问题problem@Adhavan:我能够解决问题,这不是代理或防火墙的问题。名称空间和url之间存在差异。检查WSDL并确保命名空间和url之间没有差异,这是此类场景中最常见的问题。检查编辑:在问题中,它给出了我必须进行的修改。@all:我真的有一些问题是代理。。。在这方面有一个解决方案并没有造成您看到的问题,但是您的名称空间和url不匹配,您使用的是合作伙伴API名称空间,但是企业API url。您需要合作伙伴API URL。@superfell:谢谢,我的URL和名称空间确实不匹配。我纠正了这个差异,现在它可以工作了。这并没有造成您所看到的问题,但是您的名称空间和url不匹配,您使用的是合作伙伴API名称空间,但使用的是企业API url。您需要合作伙伴API URL。@superfell:谢谢,我的URL和名称空间确实不匹配。我纠正了不一致的地方,现在可以用了。