.NETで「ログイン」というWebサービスメソッドを作成しました。これを自分のlocalhost(IIS)に公開しました。このメソッドは、これらのパラメータに一致するユーザーが存在する場合、SQL Serverにあるデータベースの2つの文字列パラメータ(ユーザー名とパスワード)のチェックを行い、誰かが1を返した場合は0を返します。正常に動作します。アンドロイドアプリから.NET WebサービスへのSOAP要求を作成するのが難しい
私はアンドロイドアプリでメソッドに到達しようとしました(最初は結果を画面に表示します)。ここでは、コード(私はこことそこから多くのビットを見つけた)です:
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"
(。私はその理由のためにここにそれを行うことができなかった原因私は、それをすべてコピーしませんでした。とにかく、同じWebサービスで他の無関係な方法がある) だから私は思います私はNAMESPACE、METHOD_NAME、SOAP_ACTIONとURLを取得しています。しかし、石鹸の初心者である私は確信することはできません。
何が問題なのですか?リクエストエンベロープが不正な形式ですか、androidHttpTransportを間違って使用していますか? (または両方とも!)
EDIT:logcatからいくつかの行を挿入します。私はそれが例外をスローする "android.os.NetworkOnMainThreadException"だと思う。私はそれを処理するためにAsynchtaskのようなものを試すべきですか?
11-11 21:17:53.607:D/AndroidRuntime(4574):17:53.667:VM 11-11 21のシャットダウンI/AndroidRuntime(4574)注:スレッドアタッチ「バインダースレッド#3 'が失敗しました 11-11 21:17:53.667:D/dalvikvm(4574):GC_CONCURRENTは102K、フリーは483K/2048K、一時停止は1ms + 3ms 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 .StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 11-11 21:17:54.237:W/System.err(4491):libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.248:W/System.err(4491):libcore.io.IoBridge.connectErrno(IoBridge.java:127) 11-11 21:17:54.248:W/System.err(4491) ):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):libcore.net.http.HttpConnection (HttpConnection.java:77) 11-11 21:17:54.317:(4491)をSystem.err/W:libcore.net.http.HttpConnectionで(HttpConnection.java:50)
私はAsynchtaskを使用して、それをやった: (everytingが存在するように、私は最初の投稿を編集しないでください)
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: How can I pass parameters to AsyncTask's onPreExecute()?
EDIT:欠けていたものを数1のため をちょうどスペースでした!
if(result.equals("LoginResponse{LoginResult=1; }"))
が問題ありません。私は方法の結果(0または1)を得る方法を知りたいです。もし誰かが答えてください知っている!
logcatから例外/スタックトレースを投稿できますか? – Torid
hmmm ..これで、logcatにNetworkOnMainThreadExceptionが表示されます。もちろん、プログラマーは止まらない。つまり、それはandroidHttpTransport.call(SOAP_ACTION、envelope)を置く必要があることを意味します。別のスレッド内のコマンドですか?または非同期タスクでですか? – george
私はAsyncTaskが良い方法だと思います...私は、一連のHTTP GET/POSTをやります。各リクエスト/レスポンスはAsyncTask doInBackground()にあり、onPostExecute()のフラグを設定します。このフラグは、新しいAsyncTaskで次のリクエスト/レスポンスをユーザーに報告します。良いことは、あなたがほとんどすべての状態を必要としない10-20メッセージの非常に可変なシーケンスです。すべては一度に1ステップずつ駆動されます。 – Torid