Android が WebService を呼び出す


このセクションの概要:

以前の学習、データリクエスト、データ分析、ファイルのアップロードとダウンロードなどの後、サーバーと対話するための基本的な要件を満たすことができるはずです。 このセクションでは、Android が WebService を呼び出す方法を紹介します。実際、これは、提供されているメソッドの一部と似ています。 集約データなどの生データAPIサービスのデータプラットフォーム! WebService は HTTP プロトコル経由で XML と SOAP を使用します リモート マシンとの対話を完了できます。さて、早速、このセクションを始めましょう~


WebService の紹介

1.png

PS: 上記の紹介を読んでもよくわからない場合は、忘れてください。同社は以前に C# を使用して WebService を構築していました。 このセクションでは、WebService の構築方法については説明しません。WebService によって提供されるサービスを取得する方法のみがわかります。 次に、返された XML データを解析し、関連するデータを Android デバイスに表示します。


2. WebService はどこで入手できますか? インターネット上には WebService を提供するサイトがたくさんあります。まず、これらのサイトを見つけて、対応するサービスを入手してください。 ここでは、説明する例として WebXml と Yunju 36wu を選択します。公式 Web サイト:

webXml

: http://www.webxml.com.cn/zh_cn/index.aspx

無料ですが、すべて商用化されており、多くのサービスは有料ですが、試してみることができます〜 このサイトでは 16 の異なる Web サービスが提供されており、必要に応じて対応するサービスをクエリしたり、さまざまなインターフェイスを呼び出すことができます。

webXml関連ページ

:

2.jpg

関連利用時間のご案内

:

3.jpg

Yunju 36wu

:http://www.36wu.com/Service

同じですレインボーバス、モバイル天気など、多くのモバイルアプリもここのインターフェイスを使用しています。 ただし、これも有料です =-= 試してみることはできますが、1 時間に送信できるリクエストは 20 件までです。 クリックして使用申請してキーを取得してください! 2 つのうちの 1 つを選択するだけです!

4.jpg

3. サードパーティの jar パッケージの準備

まず、Android プラットフォームで WebService を呼び出す場合、サードパーティのクラス ライブラリ: ksoap2 に依存する必要があります。 Android プラットフォームでは、効率的で軽量な SOAP 開発パッケージである ksoap2 Android が使用されます。

jar パッケージのダウンロード アドレス:

https://code.google.com/p/ksoap2-android/wiki/HowToUse ?tm=2

Celestial Diana は利用できない場合があります。ここに誰でもダウンロードできる Baidu Cloud への 2 つのリンクがあります:

2.54 バージョン: ksoap2-android 2.54.jar

3.30 バージョン: ksoap2-android 3.30.jar

jar パッケージのダウンロード アドレスを入力できた場合は、次のインターフェイスが表示されます:

5.jpg

6.jpg


4. まず、関連パラメータを取得します

サービスを取得し、関連するパラメータを記録します: NameSpace (名前空間)、SoapActionURL 言うまでもなく、他のパラメータは次のように見つけることができます:

7.jpg

たとえば、ここで探しているのは天気クエリ パラメータです。[Going in] をクリックすると、そのようなパラメータ ドキュメントが表示されます:

8.png

たとえば、ここで必要なのは天気クエリ パーツの関数です:

9.png

まず、フレーム化された SoapAction と NameSpace をコピーします。もちろん、このページでテストすることもできますが、さらに 私たちは無料ユーザーです。ID は入力せずにスキップできます。入力後、呼び出しボタンをクリックすると、次のようなページが開きます。

11.png

返された XML は次のとおりです。さらに、このような XML を解析します。 .gif は天気アイコンを表します。

同様に、所有権クエリの SoapAction、NameSpace、および関連するパラメーター マークを見てみましょう。

12.png

と返された XML データ :

15.png


5. 関連する WEB サービスを登録して有効にします

16.jpg

17.jpg

18.png

「My Web Server」をクリックし、「Trial」をクリックします。WebXML は 5 日間の無料トライアルを提供します。 必要な 2 つのサーバーを起動しましょう。

わかりました、自分のキーを忘れずにマークしてください~


6. WebService を呼び出すコード例

それでは、WebService を呼び出すプロセスを検証するコードを書いてみましょう:

レンダリングの実行:

19.png

PS:この番号は前の番号 =-= です。電話をかけないでください。置き換えられています~ また、気象サービスは書き込みに問題があるようで、WebXml の制限により取得できない場合があります。 結局のところ、試してみてください...

コードを実装します:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText edit_param;
    private Button btn_attribution;
    private Button btn_weather;
    private TextView txt_result;

    private String city;
    private String number;
    private String result;


    //定义获取手机信息的SoapAction与命名空间,作为常量
    private static final String AddressnameSpace = "http://WebXml.com.cn/";
    //天气查询相关参数
    private static final String Weatherurl = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
    private static final String Weathermethod = "getWeather";
    private static final String WeathersoapAction = "http://WebXml.com.cn/getWeather";
    //归属地查询相关参数
    private static final String Addressurl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
    private static final String Addressmethod = "getMobileCodeInfo";
    private static final String AddresssoapAction = "http://WebXml.com.cn/getMobileCodeInfo";


    //定义一个Handler用来更新页面:
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0x001:
                    txt_result.setText("结果显示:\n" + result);
                    Toast.makeText(MainActivity.this, "获取天气信息成功", Toast.LENGTH_SHORT).show();
                    break;
                case 0x002:
                    txt_result.setText("结果显示:\n" + result);
                    Toast.makeText(MainActivity.this, "号码归属地查询成功", Toast.LENGTH_SHORT).show();
                    break;
            }

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        edit_param = (EditText) findViewById(R.id.edit_param);
        btn_attribution = (Button) findViewById(R.id.btn_attribution);
        btn_weather = (Button) findViewById(R.id.btn_weather);
        txt_result = (TextView) findViewById(R.id.txt_result);
        btn_attribution.setOnClickListener(this);
        btn_weather.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_weather:
                new Thread() {
                    @Override
                    public void run() {
                        getWether();
                    }
                }.start();
                break;
            case R.id.btn_attribution:
                new Thread(new Runnable() {
                    public void run() {
                        getland();
                    }
                }).start();
                break;
        }
    }


    //定义一个获取某城市天气信息的方法:
    public void getWether() {
        result = "";
        SoapObject soapObject = new SoapObject(AddressnameSpace, Weathermethod);
        soapObject.addProperty("theCityCode:", edit_param.getText().toString());
        soapObject.addProperty("theUserID", "dbdf1580476240458784992289892b87");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut = soapObject;
        envelope.dotNet = true;
        envelope.setOutputSoapObject(soapObject);
        HttpTransportSE httpTransportSE = new HttpTransportSE(Weatherurl);
        System.out.println("天气服务设置完毕,准备开启服务");
        try {
            httpTransportSE.call(WeathersoapAction, envelope);
//            System.out.println("调用WebService服务成功");
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("调用WebService服务失败");
        }

        //获得服务返回的数据,并且开始解析
        SoapObject object = (SoapObject) envelope.bodyIn;
        System.out.println("获得服务数据");
        result = object.getProperty(1).toString();
        handler.sendEmptyMessage(0x001);
        System.out.println("发送完毕,textview显示天气信息");
    }


    //定义一个获取号码归属地的方法:
    public void getland() {
        result = "";
        SoapObject soapObject = new SoapObject(AddressnameSpace, Addressmethod);
        soapObject.addProperty("mobileCode", edit_param.getText().toString());
        soapObject.addProperty("userid", "dbdf1580476240458784992289892b87");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut = soapObject;
        envelope.dotNet = true;
        envelope.setOutputSoapObject(soapObject);
        HttpTransportSE httpTransportSE = new HttpTransportSE(Addressurl);
        //	System.out.println("号码信息设置完毕,准备开启服务");
        try {
            httpTransportSE.call(AddresssoapAction, envelope);
            //System.out.println("调用WebService服务成功");
        } catch (Exception e) {
            e.printStackTrace();
            //System.out.println("调用WebService服务失败");
        }

        //获得服务返回的数据,并且开始解析
        SoapObject object = (SoapObject) envelope.bodyIn;//System.out.println("获得服务数据");
        result = object.getProperty(0).toString();//System.out.println("获取信息完毕,向主线程发信息");
        handler.sendEmptyMessage(0x001);
        //System.out.println("发送完毕,textview显示天气信息");
    }


}

また、パッケージとインターネット権限をインポートすることを忘れないでください。


リファレンスコードのダウンロード:

WebServiceDemo.zip: WebServiceDemo.zipをダウンロード


このセクションの概要:

さて、このセクションではここまでで、Android 側でこの WebService を使用する方法を説明します。次は1つのセクションで学習しましょう ブラウザに似た Android コントロール - WebView をご期待ください~ありがとう~!