Я сделал в .NET метод веб-службы под названием «Логин» и опубликовал его на своем локальном хосте (IIS). Метод просто принимает 2 строковых параметра (имя пользователя и пароль) проверяет базу данных, которая есть у меня на моем сервере sql, если есть пользователь, который соответствует этим параметрам, и если он находит, что кто-то возвращает 1, иначе он возвращает 0. Из моего браузера это все отлично работает.
Я пытался найти способ с помощью приложения для Android (сначала просто возьмите результат и покажите его на экране). Вот код (я нашел много бит здесь и там):
public class LoginCheck extends Activity {
private static final String SOAP_ACTION = "http://tabtobook.org/Login";
private static final String METHOD_NAME = "Login";
private static final String NAMESPACE = "http://tabtobook.org/";
private static final String URL = "http://192.168.1.2/TabBookServices/Users.asmx";
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
/** Called when the activity is first created. */
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
ServiceCall();
}
public void ServiceCall()
{
try{
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
String A="user1";
request.addProperty("Username", A);
String B="user1";
request.addProperty("Password", B);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject)envelope.getResponse();
tv.setText(result.toString());
}
catch (final IOException e)
{
((TextView) findViewById(R.id.tView)).setText("test3");
e.printStackTrace();
} catch (final XmlPullParserException e)
{
e.printStackTrace();
} catch (final Exception e)
{
e.printStackTrace();
}
}
}
Начиная с моей отладки, программа выдает «окончательное исключение e» (самое последнее в моем коде), когда оно идет в строке «androidHttpTransport.call (SOAP_ACTION, envelope);». Из WSDL я получаю:
targetNamespace="http://tabtobook.org/", location="http://localhost/TabBookServices/Users.asmx, soapAction="http://tabtobook.org/Login"
(Я не скопировал все это, потому что не мог сделать это здесь по какой-то причине. В любом случае, в том же веб-сервисе есть и другие неуместные методы)
Поэтому я думаю, что я правильно понял NAMESPACE, METHOD_NAME, SOAP_ACTION и URL. Но, будучи новичком в мыле, я не уверен.
Так что не так? Неправильный ли запрос конверта, или я неправильно использую androidHttpTransport? (Или может и то и другое!)
РЕДАКТИРОВАТЬ: я положил несколько строк из logcat. Я думаю, что это исключение android.os.NetworkOnMainThreadException. Должен ли я попробовать что-то вроде Asynchtask справиться с этим?
11-11 21: 17: 53.607: D / AndroidRuntime (4574): выключение виртуальной машины
11-11 21: 17: 53.667: I / AndroidRuntime (4574): ПРИМЕЧАНИЕ: не удалось подключить нить «Нить Binder # 3»
11-11 21: 17: 53.667: D / dalvikvm (4574): GC_CONCURRENT освобождено 102K, 77% свободно 483K / 2048K, пауза 1 мс + 3 мс
11-11 21: 17: 53.667: D / dalvikvm (4574): отладчик отключился; Реестр объектов имел 1 записей
11-11 21: 17: 54.117: W / System.err (4491): android.os.NetworkOnMainThreadException
11-11 21: 17: 54.237: W / System.err (4491): в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1084)
11-11 21: 17: 54.237: W / System.err (4491): at libcore.io.BlockGuardOs.connect (BlockGuardOs.java:74)
11-11 21: 17: 54.248: W / System.err (4491): at libcore.io.IoBridge.connectErrno (IoBridge.java:127)
11-11 21: 17: 54.248: W / System.err (4491): at libcore.io.IoBridge.connect (IoBridge.java:112)
11-11 21: 17: 54.298: W / System.err (4491): на java.net.PlainSocketImpl.connect (PlainSocketImpl.java:192)
11-11 21: 17: 54.298: W / System.err (4491): на java.net.PlainSocketImpl.connect (PlainSocketImpl.java:459)
11-11 21: 17: 54.298: W / System.err (4491): на java.net.Socket.connect (Socket.java:842)
11-11 21: 17: 54.307: W / System.err (4491): at libcore.net.http.HttpConnection. (HttpConnection.java:77)
11-11 21: 17: 54.317: W / System.err (4491): at libcore.net.http.HttpConnection. (HttpConnection.java:50)
Я сделал это с помощью Asynchtask:
(Я не редактирую первый пост, чтобы все там существовало)
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
String A="user2";
request.addProperty("Username", A);
String B="user2";
request.addProperty("Password", B);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject)envelope.bodyIn;
response=result.toString();
}
catch (Exception e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
tv.setText(result);
}
}
public void ServiceCall() {
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute();
}
}
На моем экране отображается «LoginResponse {LoginResult = 1;}», если пользователь существует, или «LoginResponse {LoginResult = 0;}», если он не существует. Так что метод работает отлично!
Теперь у меня есть 2 проблемы, чтобы сделать его модулем входа в систему, как я хочу (конечно, я буду искать их):
Мне нужен способ взять только результат "0" или "1" из метода. Или я думаю, что я мог бы использовать всю строку. Но когда я пытаюсь что-то вроде "if (result.equals (" LoginResponse {LoginResult = 1;} "))", это не работает (оно не получает истинное значение). В чем проблема?
Я хочу, чтобы пользователь ввел данные. Поэтому я должен передать аргументы AsyncTask. Это возможно? Или мне следует выполнить чтение ввода (установить слушателя на кнопку) внутри класса AsyncTask?
EDIT:
для номера 2 я нашел ответ здесь -> Android: Как я могу передать параметры в OnPreExecute () AsyncTask?
EDIT:
для номера 1 не хватало только места!
if(result.equals("LoginResponse{LoginResult=1; }"))
отлично работает! Я хотел бы знать, как получить только результат методов (0 или 1), хотя. Если кто-то знает, пожалуйста, ответьте!