Привет. Я пытаюсь войти в систему продаж через веб-сервис на платформе Android. Но я сталкиваюсь с некоторыми проблемами. Я получаю «Исключение сокета: истекло время ожидания операции» . Я использую мыльный код Ksoap2, портированный для Android, и подробности WSDL взяты из WSDL партнера моей учетной записи разработчика в Salesforce. Я активировал «доступ к API». Также имя пользователя и пароль действительны. Я пытаюсь сделать это через среду разработки (Eclipse) на моем эмуляторе для Android для настольных компьютеров.
Может кто-нибудь, пожалуйста, помогите мне выяснить, если я что-то упустил и решить эту проблему.
Ниже приведен исходный код:
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();
}
}
}
Редактировать: Для справки любого, кто ссылается на эту ветку, я смог запустить вышеупомянутый веб-сервис, проблема заключалась в несоответствии между URL-адресом и пространством имен. Со следующими модификациями приведенный выше код работает отлично.
NAMESPACE = "urn:partner.soap.sforce.com";
URL = "https://login.salesforce.com/services/Soap/u/20.0";
SOAP_ACTION = "soap";