iPhoneからSOAPサービスにアクセスする方法


224

iPhone向けのアプリを開発する予定です。そのアプリはいくつかのSOAPサービスにアクセスする必要があります。iPhone SDKでいくつかの基本的なチェックを行ったところ、SOAPサービスへのアクセスのサポートを見つけることができませんでしたが、少しグーグルすると、iPhone SDKではSOAPがサポートされていないという結論に至りました。

そのため、そのアプリを作成したい場合は、iPhoneからSOAPサービスにアクセスするためのアプローチを考え出す必要があります。最善のアプローチは何でしょうか?ベストプラクティスはありますか?誰かがすでにSOAPサービスにアクセスするためにiPhone SDKにある機能を使ってライブラリを書いたのですか?

(私がアクセスする必要のあるサービスは別のパーティによって公開されており、SOAPとして公開しているだけなので、残念ながら別のタイプのインターフェース(RESTベースのAPIなど)に切り替えることはできません。

下呂


9
こんにちは下呂、あなたのアプリケーションに使用した石けんサービスは何ですか。あなたが正解を述べていないので。
アメヤ2010

3
サービスを使用した後、他の人のための将来の参考のためにチュートリアルを投稿してください。
Vineesh TP 2012

回答:


52

一言:しないでください。

もちろん、それは本当の答えではありません。しかし、それでもSOAPは絶対に避けなければなりません。;-) iPhoneとWebサービスの間にプロキシサーバーを追加することはできますか?おそらくRESTをSOAPに変換するものでしょうか?

libxml2(iPhone SDKに含まれている)に依存するSOAPライブラリであるCSOAPを試すことができます。

OSX用の独自のSOAPフレームワークを作成しました。ただし、アクティブに維持されておらず、iPhoneへの移植にしばらく時間がかかります(開始するには、NSXMLをTouchXMLに置き換える必要があります)。


11
「しかし、SOAPは
絶対に

9
石鹸が必ずしも適切であるとは限らないからといって、それが彼の実装で正しくないという意味ではありません。ベストプラクティスを超えるニーズが頻繁にあります
Anthony Main

11
@schwa-裏付けとなる証拠や防御策がまったくない、潜在的に有用な回答を投稿したことに対する反対票。
DougW 2010

12
これは、「デフォルトでは提供されていないため、使用しないでください」と技術的に同等です-サービスで提供されるSOAPまたはその他のメカニズムを使用してはならない実際の技術的な理由はありません。
Petesh 2010年

9
ここに少なくとも答えがあります。SOAPはRESTに比べて非常にオーバーヘッドの高いプロトコルです。すべての名前空間と有効性のチェックなどにより、メッセージに追加の文字が大量に追加されます。これは、3Gなどの高遅延で潜在的に遅いネットワークでは回避したいものです。アプリが優れた信号の4g環境でのみ、またはWifiでのみ使用されることを保証できる場合は、より適切な場合があります。しかし、一般的にモバイルネットワーキングでは、少ないほど多くなります。
Vineel Shah、2012

7

私の解決策は、プロキシサーバーでRESTを受け入れ、SOAPリクエストを発行し、PHPを使用して結果を返すことでした。

実装時間:15〜30分。

エレガントではありませんが、しっかりしています。


4
どうでした?ドキュメント。tnx

3
神秘的な無回答が大好きです。これはどうして賛成されたのですか?
gdbj

@gdbjは、RESTとSOAPの間の1:1変換は自明でなければならないためです...
マジックタコの壷

1
それが何なのか、しかしどうやって人々がここに来るのかという質問には答えません。特に実装が非常に単純な場合、実装はどのようになるのか、私はまだ知りたいです。
gdbj 2017

4

私はこれまで、Objective-CからのSOAPスタイルのリクエストを行う必要がある場合に対処するために、低レベル(XMLの生成と解析)で自分のアクセスをロールバックしてきました。それは図書館利用可能と呼ばいるSOAPClient(そこだ、と述べたのSoapClientオープンソース(BSDがライセンス)とGoogleのコード(で提供されています)、MAC-のSoapClient関心があるかもしれません)。

私はこれを使用したことがないか、APIを使用する必要があったので、その能力や有効性を証明しませんが、それは利用可能であり、ニーズに応じて迅速な解決策を提供する可能性があります。

Appleはかつて、WS-MakeStubsと呼ばれる非常に壊れたユーティリティを持っていました。iPhoneでは利用できないと思いますが、それを置き換えることを目的としたオープンソースライブラリにも興味があるかもしれません。コードは、SOAPクライアントと対話するためのObjective-Cを生成します。繰り返しますが、使用していませんが、メモにwsdl2objcと書き留めています。


おかげで、私はwsdl2objcを使用しようとしました。WSDLからのObjectiveCコードの生成は機能しますが、(予想どおり)iPhone SDKに対して直接コンパイルされません。ソースを少し調整しようとしたが、解決できない一連のエラーが発生した
Gero

2

http://www.wsdl2code.comで見つけたツールを使用して接続できます

SampleServiceProxy *proxy = [[SampleServiceProxy alloc]initWithUrl:@"YOUR
        URL" AndDelegate:self];

[proxy GetDouble];
[proxy GetEnum];
[proxy getEnum:kTestEnumTestEnum2];
[proxy GetInt16];
[proxy GetInt32];
[proxy GetInt64];
[proxy GetString];
[proxy getListStrings];

2

SOAPサービス形式を使用してAPI呼び出しを実行する迅速な4つのサンプルコードを次に示します。

   func callSOAPWSToGetData() {

        let strSOAPMessage =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                "<soap:Body>" +
                "<CelsiusToFahrenheit xmlns=\"http://www.yourapi.com/webservices/\">" +
                "<Celsius>50</Celsius>" +
                "</CelsiusToFahrenheit>" +
                "</soap:Body>" +
        "</soap:Envelope>"

        guard let url = URL.init(string: "http://www.example.org") else {
            return
        }
        var request = URLRequest.init(url: url)
        let length = (strSOAPMessage as NSString).length
        request.addValue("application/soap+xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("http://www.yourapi.com/webservices/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
        request.addValue(String(length), forHTTPHeaderField: "Content-Length")
        request.httpMethod = "POST"
        request.httpBody = strSOAPMessage.data(using: .utf8)

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        let task = session.dataTask(with: request) { (data, response, error) in
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            guard error == nil else {
                print("error calling GET on /todos/1")
                print(error ?? "")
                return
            }
            print(responseData)
            let strData = String.init(data: responseData, encoding: .utf8)
            print(strData ?? "")
        }
        task.resume()
    }

0

こちらのリンクとそのロードマップをご覧ください。彼らは途中でRO | Cを使用していて、おそらくSOAPを含むWebサービスに接続できます(私は間違いなくそれを含むVCLバージョンを使用しています)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.