564

Android で標準の SOAP/WSDL Web サービスを呼び出す方法に関する適切な情報を見つけるのに苦労しています。私が見つけることができたのは、非常に複雑なドキュメントと「kSoap2」への参照、およびSAXを使用してすべて手動で解析することについての少しのいずれかです。わかりました、それで結構ですが、今は 2008 年なので、標準の Web サービスを呼び出すための優れたライブラリが必要だと考えました。

Web サービスは、基本的にNetBeansで作成されたものです。配管クラスを生成するための IDE サポートが必要です。Android ベースの電話からWSDLベースの Web サービスに接続する最も簡単でエレガントな方法が必要です。

4

26 に答える 26

251

Android は、いかなる種類の SOAP ライブラリも提供していません。独自のものを作成するか、kSOAP 2などを使用できます。お気づきのように、他の人は自分のプロジェクトで kSOAP2 をコンパイルして使用することができましたが、私はそうする必要はありませんでした。

これまでのところ、Google は SOAP ライブラリを Android に追加することにほとんど関心を示していません。これについての私の疑いは、REST ベースのサービスに向かう Web サービスの現在のトレンドをサポートし、JSON をデータ カプセル化形式として使用することを望んでいるということです。または、メッセージングに XMPP を使用します。しかし、それは単なる推測です。

現時点では、XML ベースの Web サービスは、Android ではやや重要なタスクです。NetBeans を知らないので、NetBeans で利用できるツールについて話すことはできませんが、より優れたライブラリが利用可能であることには同意します。XmlPullParser を使用すると SAX を使用しなくて済む可能性がありますが、それについてはよくわかりません。

于 2008-11-19T21:50:32.780 に答える
99

org.apache.http.impl.client.DefaultHttpClientデフォルトではAndroidSDKに含まれています。これで、WSDLに接続できます。

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
于 2009-01-08T22:17:35.247 に答える
60

オーバーヘッドがあるため、SOAPはモバイルデバイスとのデータ交換に最適な選択肢ではないことは事実です。ただし、サーバー出力の形式を制御できない状況に陥る可能性があります。

したがって、SOAPを使い続ける必要がある場合は、Android用にパッチが適用されたkSOAP2ライブラリがここにあります:
http ://code.google.com/p/ksoap2-android/

于 2009-10-10T10:57:57.990 に答える
31

モバイルデバイス(特にAndroid携帯電話)からWebサービスを呼び出すために、私はそれを行うための非常に簡単な方法を使用しました。Webサービスを呼び出そうとしてWebサービスクライアントAPIを使用したことはありません。私のアプローチは次のとおりです。

  1. Java標準APIを使用して、単純なHTTP接続を作成します HttpURLConnection
  2. SOAPリクエストを作成します。(SOAPUIを使用してSOAPリクエストを作成できます。)
  3. doOutPutフラグをtrueに設定します。
  4. content-length、Content type、User-agentなどのHTTPヘッダー値を設定します。Content-length値は必須であるため、忘れずに設定してください。
  5. SOAPリクエスト全体を出力ストリームに書き込みます。
  6. メソッドを呼び出して接続を確立し、応答を受信します(私の場合はを使用し getResonseCodeました)。
  7. 受信した応答コードが
    1. これは、Webサービスの呼び出しに成功したことを意味します。
  8. 次に、同じHTTP接続で入力ストリームを取得し、文字列オブジェクトを受け取ります。この文字列オブジェクトはSOAP応答です。
  9. 応答コードが200以外の場合は、ErrorInput同じHTTPobjectでストリームを取得し、エラーがあればそれを受け取ります。
  10. SAXParser(私の場合)またはDOMParaserまたはその他の解析メカニズムを使用して、受信した応答を解析します。

この手順をAndroidスマートフォンに実装しましたが、正常に実行されています。700 KBを超えていても、応答を解析できます。

于 2010-02-04T10:55:25.403 に答える
30

SOAP は、処理/解析のオーバーヘッドが必要なため、Android (または一般的なモバイル デバイス) での使用には適していないテクノロジです。REST サービスはより軽量なソリューションであり、それが私が提案するものです。Android には SAX パーサーが付属しており、使用するのはかなり簡単です。モバイル デバイスで SOAP を処理/解析する必要がある場合は、申し訳ありませんが、SOAP を使用しないことをお勧めします。

于 2009-01-12T17:04:32.017 に答える
24

約1年前、私はこのスレッドを読んで、AndroidでSOAP呼び出しを行う方法を理解しようとしていました。HttpClientを使用して独自のSOAP呼び出しを作成するという提案により、Android用の独自のSOAPライブラリを構築することになりました。

IceSoap

基本的に、単純なJava APIを介して送信するエンベロープを構築し、XPathを介して定義したオブジェクトに自動的に解析することができます...例:

<Dictionary>
    <Id></Id>
    <Name></Name>
</Dictionary>

になる:

@XMLObject("//Dictionary")
public class Dictionary {
    @XMLField("Id")
    private String id;

    @XMLField("Name")
    private String name;
}

私はそれを自分のプロジェクトに使用していましたが、他の人に役立つかもしれないと思ったので、それを分離して文書化することに時間を費やしました。「SOAPAndroid」をグーグルで検索しているときにこのスレッドにつまずいたあなたの貧しい人々の何人かがそれを試して、いくつかの利益を得ることができれば、私は本当にそれが大好きです。

于 2012-01-29T11:56:00.133 に答える
24

プロジェクトに ksoap2.jar を追加することを忘れないでください。また、AndroidManifest ファイルに INTERNET 権限を追加してください。

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}
于 2012-06-07T06:50:43.750 に答える
21

私は KSOAP を試してみました。私はかなり単純なアプローチを選びました。

WSDL ファイルを指定して、各リクエストの SOAP リクエスト テンプレートを作成し (例: SOAP UI を使用)、コードで渡される値を置き換えます。DefaultHttpClient インスタンスを使用してこのデータをサービス エンドポイントに POST し、応答ストリームを取得します。XML プル パーサーを使用して応答ストリームを解析します。

于 2009-12-21T16:10:07.703 に答える
18

WSClient++を見ることができます

于 2010-07-15T08:52:51.770 に答える
16

Androidプラットフォーム用の新しいSOAPクライアントを作成しました。JAX-WSで生成されたインターフェイスを使用していますが、これはこれまでのところ概念実証にすぎません。

興味がある場合は、例を試すか、AndroidSOAPのソースをご覧ください。

于 2010-10-19T15:42:44.500 に答える
15

可能であれば、JSON を使用してください。Android には完全な org.json パッケージが付属しています

于 2009-12-23T15:14:28.677 に答える
14

ksoap2メソッドを呼び出します。それは非常にうまく動作します。

などの詳細を設定します

private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);

envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);

そして、結果を得るために

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
于 2011-05-18T07:19:21.577 に答える
13

AndroidからWebサービスを呼び出すことが役立つことを願っています。

于 2010-04-25T01:06:14.620 に答える
11

数か月前、私は j2ee アプリケーションで jax-ws Web サービスを使用していました。CXF wsdl2javaを使用して WSDL ファイルから WS クライアント スタブを生成し、それらのクライアント スタブを使用して Web サービスを使用していました。数週間前、Android プラットフォームで同じ方法で Web サービスを使用しようとしたとき、できませんでした。これは、Android jar にすべての「jax-ws」サポート クラスが含まれているわけではないためです。その時、私の要件を満たすツールは見つかりませんでした (Google で効率的に検索できなかった場合)。

  • WSDL からクライアント スタブを取得します。
  • そして、いくつかの引数 (Java ビジネス要求オブジェクト) を指定してサービスを呼び出します。
  • 応答ビジネス オブジェクトを取得します。

そこで、独自のAndroid SOAP Client Generation Toolを開発しました。これらの手順に従う必要がある場所:

  • WSDL から WS Client Stub を取得し、プロジェクトに配置します。
  • 一部のサービス「ComplexOperationService」について、サービスをインスタンス化し、エンドポイント ポートを取得してサービス メソッドを呼び出し、Web サービスからの応答を取得します。

例えば:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • すべてが WSDL から生成されることがわかっているため、サービス クラス/要求/応答クラス、またはその他のクラスやメソッドについても気にする必要はありません。
  • もちろん、soap アクション/エンベロープ/名前空間などを意識する必要はありません。開発者が常に行っているように、メソッドを呼び出すだけです。
于 2012-05-10T15:53:29.197 に答える
9

Axisを使用して小さなSOAPクライアントを作成できると確信しています。Axisのインストール手順

于 2008-11-18T17:49:15.560 に答える
8

Android アプリケーションから Call SOAP Web Service が役立つと思います。

于 2011-01-28T10:35:53.107 に答える
6

私にとって最も簡単な方法は、優れたツールを使用して必要なすべてのクラスを生成することです。個人的には以下のサイトを利用しています。

http://easywsdl.com/

非常に複雑な Web サービスをサポートし、ksoap2 を使用します。

于 2013-11-13T06:54:42.860 に答える
6

JSON を使用できる場合は、PHP サーバーと Android Phone クライアントを使用したアプリケーション サービスの開発にホワイトペーパー、ビデオ、および sample.code があります。

于 2011-04-24T10:07:38.610 に答える
5

私を大いに助けてくれた非常に便利なツールをチェックすることをお勧めします。そのプロジェクトの世話をする人たちもとても役に立ちました. www.wsdl2code.com/

于 2013-05-28T06:58:45.033 に答える
5

Android での Web サービスの呼び出しに関して問題がある場合は、以下のコードを使用して Web サービスを呼び出し、応答を得ることができます。Web サービスがデータ テーブル形式で応答を返すことを確認してください。このコードは、 SQL Serverデータベースのデータを使用する場合に役立ちます。MYSQLを使用している場合は、NewDataSetという単語を文obj2=(SoapObject) obj1.getProperty("NewDataSet");からDocumentElementに置き換えるだけで、1 つのことを変更する必要があります。

void callWebService(){ 

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

これに関して問題がある場合は、私に書いてください..

于 2012-05-21T08:20:36.847 に答える
3

特定のヘッダーを使用して、HTTP 経由のポストとして SOAP 呼び出しを実行できます。ksoap2 のような追加のライブラリを使用せずにこの質問を解決しました ここに石鹸サービスから注文を取得するライブコードがあります

private static HashMap<String,String> mHeaders = new HashMap<>();

static {
    mHeaders.put("Accept-Encoding","gzip,deflate");
    mHeaders.put("Content-Type", "application/soap+xml");
    mHeaders.put("Host", "35.15.85.55:8080");
    mHeaders.put("Connection", "Keep-Alive");
    mHeaders.put("User-Agent","AndroidApp");
    mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
    int status=0;
    String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
            "   <soap:Header/>\n" +
            "   <soap:Body>\n" +
            "      <ser:GetAllOrdersOfShipment>\n" +
            "         <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
            "      </ser:GetAllOrdersOfShipment>\n" +
            "   </soap:Body>\n" +
            "</soap:Envelope>";
    StringBuffer chaine = new StringBuffer("");

    HttpURLConnection connection = null;
    try {
        URL url = new URL(stringUrlShipments);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
        connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");

        for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            connection.setRequestProperty(key,value);

        }

        connection.setRequestMethod("POST");
        connection.setDoInput(true);

        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(xmlstring.getBytes("UTF-8"));
        outputStream.close();

        connection.connect();
        status = connection.getResponseCode();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        Log.i("HTTP Client", "HTTP status code : " + status);
    }

    InputStream inputStream = null;
    try {
        inputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return inputStream;
}
于 2016-08-19T05:42:08.570 に答える
2

Android から SOAP Web サービスを呼び出すには、このクライアントを使用してみてください

Java ビルド パスに ksoap2-android.jar を追加することを忘れないでください

public class WsClient {
    private static final String SOAP_ACTION = "somme";
    private static final String OPERATION_NAME = "somme";
    private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
    private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";

    public String caclculerSomme() {

        String res = null;
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
        request.addProperty("a", "5");
        request.addProperty("b", "2");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);

        try {
            httpTransport.call(SOAP_ACTION, envelope);
            String result = envelope.getResponse().toString();
            res = result;
            System.out.println("############# resull is :" + result);
        } catch (Exception exception) {
            System.out.println("########### ERRER" + exception.getMessage());
        }

        return res;
    }
}
于 2012-06-07T00:13:21.810 に答える
1

Soap Libaray( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar) を追加します。

public static String Fn_Confirm_CollectMoney_Approval(

        HashMap < String, String > str1,
        HashMap < String, String > str2,
        HashMap < String, String > str3) {

    Object response = null;
    String METHOD_NAME = "CollectMoney";
    String NAMESPACE = "http://xxx/yyy/xxx";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    String SOAP_ACTION = "";

    try {

        SoapObject RequestParent = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapObject Request1 = new SoapObject(NAMESPACE, "req");

        PropertyInfo pi = new PropertyInfo();

        Set mapSet1 = (Set) str1.entrySet();

        Iterator mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            String keyValue = (String) mapEntry.getKey();

            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        mapSet1 = (Set) str3.entrySet();

        mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        SoapObject HeaderRequest = new SoapObject(NAMESPACE, "XXX");

        Set mapSet = (Set) str2.entrySet();

        Iterator mapIterator = mapSet.iterator();

        while (mapIterator.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            HeaderRequest.addProperty(pi);
        }

        Request1.addSoapObject(HeaderRequest);

        RequestParent.addSoapObject(Request1);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER10);

        soapEnvelope.dotNet = false;

        soapEnvelope.setOutputSoapObject(RequestParent);

        HttpTransportSE transport = new HttpTransportSE(URL, 120000);

        transport.debug = true;

        transport.call(SOAP_ACTION, soapEnvelope);

        response = (Object) soapEnvelope.getResponse();

        int cols = ((SoapObject) response).getPropertyCount();

        Object objectResponse = (Object) ((SoapObject) response)
                .getProperty("Resp");

        SoapObject subObject_Resp = (SoapObject) objectResponse;


        modelObject = new ResposeXmlModel();

        String MsgId = subObject_Resp.getProperty("MsgId").toString();


        modelObject.setMsgId(MsgId);

        String OrgId = subObject_Resp.getProperty("OrgId").toString();


        modelObject.setOrgId(OrgId);

        String ResCode = subObject_Resp.getProperty("ResCode").toString();


        modelObject.setResCode(ResCode);

        String ResDesc = subObject_Resp.getProperty("ResDesc").toString();


        modelObject.setResDesc(ResDesc);

        String TimeStamp = subObject_Resp.getProperty("TimeStamp")
                .toString();


        modelObject.setTimestamp(ResDesc);

        return response.toString();

    } catch (Exception ex) {

        ex.printStackTrace();

        return null;
    }

}
于 2016-05-30T11:27:41.577 に答える