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를 예로 들어 설명하겠습니다. 공식 웹사이트:

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

이전에는 무료지만 모두 상용화되어 있고, 많은 서비스가 유료지만 사용해 볼 수 있어요~ 이 사이트는 16개의 다양한 웹 서비스를 제공하며 필요에 따라 해당 서비스를 쿼리하고 다양한 인터페이스를 호출할 수 있습니다.

webXml 관련 페이지:

2.jpg

관련 사용시간 안내:

3.jpg

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

그렇습니다 또한 Rainbow Bus, 모바일 날씨 등과 같은 많은 모바일 앱이 여기 인터페이스를 사용합니다. 그러나 이것도 요금이 부과됩니다 =-= 시도해 볼 수는 있지만 한 시간에 20개의 요청만 보낼 수 있습니다. 사용신청을 누르고 키를 받으세요!

4.jpg


3. 타사 jar 패키지 준비

먼저 Android 플랫폼에서 WebService를 호출하려는 경우 , 타사 클래스 라이브러리인 ksoap2를 사용해야 합니다. Android 플랫폼에서는 효율적이고 가벼운 SOAP 개발 패키지인 ksoap2 Android가 사용됩니다.

jar 패키지 다운로드 주소: https://code.google.com/p/ksoap2-android/wiki/HowToUse ?tm=2

Celestial Dynamise에 액세스하지 못할 수도 있습니다. 다음은 모든 사람이 다운로드할 수 있는 Baidu Cloud에 대한 두 개의 링크입니다:

2.54 버전: ksoap2-android 2.54.jar

3.30 버전: ksoap2-android 3.30.jar

jar 패키지의 다운로드 주소를 입력할 수 있을 만큼 운이 좋으면 다음 인터페이스가 표시됩니다.

5.jpg

6.jpg


4 관련 매개변수 가져오기

먼저 다음을 찾으세요. 서비스를 얻은 다음 관련 매개변수 NameSpace(네임스페이스), SoapActionURL을 기록합니다. 말할 필요도 없이 다른 매개변수는 다음과 같이 찾을 수 있습니다.

7.jpg

예를 들어, 여기에서 날씨 쿼리 매개변수를 찾고 있습니다. 들어가기를 클릭하면 다음과 같은 매개변수 문서를 볼 수 있습니다.

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

내 웹 서버를 클릭한 다음 평가판을 클릭하세요. WebXML은 5일 무료 평가판을 제공합니다. 필요한 두 서버를 시작합시다!

알겠습니다. 자체 키를 표시하세요~


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를 사용하는 방법에 대해 여기서 끝낼 것입니다. 다음 한 섹션에서 하나씩 배워봅시다 브라우저와 유사한 안드로이드 컨트롤 - WebView, 기대해주세요~감사합니다~!