Jak uzyskać dostęp do usług SOAP z iPhone'a

224

Planuję opracować aplikację na iPhone'a, która musiałaby uzyskać dostęp do kilku usług SOAP. Podczas wykonywania podstawowych czynności sprawdzających w zestawie SDK iPhone'a nie byłem w stanie znaleźć żadnej pomocy w dostępie do usług SOAP, trochę Googlingu doprowadziło do wniosku, że brak jest obsługi SOAP w zestawie SDK iPhone'a.

Więc jeśli chcę zbudować tę aplikację, muszę wymyślić sposób dostępu do usług SOAP z iPhone'a. Jakie byłoby najlepsze podejście? Jakieś najlepsze praktyki? Czy ktoś już napisał bibliotekę, korzystając z funkcji dostępnej w zestawie iPhone SDK, aby uzyskać dostęp do usług SOAP?

(Ponieważ usługa, do której muszę uzyskać dostęp, jest ujawniana przez inną firmę i ujawniają ją tylko jako SOAP, niestety nie jest dostępna opcja przełączenia na inny typ interfejsu (np. Interfejs API oparty na REST).

Gero

Gero
źródło
9
Cześć Gero, Z jakiej usługi mydlanej korzystałeś do swojej aplikacji? jak nie wspomniałeś żadnych poprawnych odpowiedzi.
Ameya,
3
Po skorzystaniu z usługi opublikuj samouczki, aby móc z nich skorzystać w przyszłości.
Vineesh TP,

Odpowiedzi:

52

Jedno słowo: nie.

OK, oczywiście, że to nie jest prawdziwa odpowiedź. Ale nadal należy unikać mydła za wszelką cenę. ;-) Czy można dodać serwer proxy między iPhone'em a usługą internetową? Być może coś, co przekształca REST w SOAP?

Państwo mogli spróbować CSOAP , biblioteka SOAP, który zależy od libxml2 (który jest zawarty w iPhone SDK).

Napisałem własną strukturę SOAP dla OSX. Jednak nie jest aktywnie utrzymywany i wymaga trochę czasu na przeniesienie na iPhone'a ( na początek musisz zastąpić NSXML TouchXML )

schwa
źródło
11
Czy możesz rozwinąć tę wypowiedź: „Mimo wszystko SOAP należy unikać za wszelką cenę”
WillF
9
To, że mydło niekoniecznie jest odpowiednie, nie oznacza, że ​​jest niewłaściwe w jego wdrażaniu, są potrzeby, które wykraczają poza najlepsze praktyki częściej niż nie
Anthony Main
11
@schwa - Doceniony za opublikowanie potencjalnie użytecznej odpowiedzi bez absolutnie żadnych dowodów potwierdzających ani obrony.
DougW,
12
Jest to techniczny odpowiednik „Nie używaj go, ponieważ domyślnie nie jest dostępny” - Nie ma rzeczywistego technicznego powodu, dla którego nie należy używać SOAP ani żadnego innego mechanizmu zapewnianego przez usługę.
Petesh
9
Oto przynajmniej odpowiedź - SOAP jest protokołem o bardzo dużym narzutu w porównaniu do REST. Cała przestrzeń nazw i sprawdzanie poprawności dodaje wiele dodatkowych znaków do wiadomości, i właśnie tego chcesz uniknąć w sieci o dużym opóźnieniu, potencjalnie wolnej, takiej jak 3G. Jeśli możesz zagwarantować, że Twoja aplikacja będzie używana tylko w środowisku 4g z doskonałym sygnałem lub tylko w Wi-Fi, może być bardziej odpowiednia. Ale ogólnie w przypadku sieci mobilnych mniej znaczy więcej.
Vineel Shah,
7

Moje rozwiązanie polegało na tym, aby serwer proxy zaakceptował REST, wydał żądanie SOAP i zwrócił wynik za pomocą PHP.

Czas na wdrożenie: 15-30 minut.

Nie najbardziej elegancki, ale solidny.

davidjhinson
źródło
4
Jak to zrobiłeś? wszelkie dokumenty. tnx
Wiosna,
3
Uwielbiam tajemniczy brak odpowiedzi. jak to było oceniane?
gdbj
@gdbj, ponieważ konwersja 1: 1 między REST i SOAP powinna być oczywista ...
Magic Octopus Urn
1
To jest Co, ale nie odpowiada na pytanie Jak, dlatego ludzie tu przychodzą. Nadal jestem ciekawy odpowiedzi na pytanie, jakie byłoby wdrożenie tutaj, szczególnie jeśli jest to takie proste.
gdbj
4

Historycznie wprowadziłem własny dostęp na niskim poziomie (generowanie XML i parsowanie), aby poradzić sobie z okazjonalną potrzebą wykonywania żądań w stylu SOAP z Objective-C. To powiedziawszy, dostępna jest biblioteka o nazwie SOAPClient ( soapclient ), która jest open source (licencjonowana BSD) i dostępna w Google Code ( mac-soapclient ), która może być interesująca.

Nie będę potwierdzać jego umiejętności ani skuteczności, ponieważ nigdy go nie użyłem ani nie musiałem pracować z jego interfejsami API, ale jest on dostępny i może zapewnić szybkie rozwiązanie w zależności od potrzeb.

Apple miał kiedyś bardzo zepsute narzędzie o nazwie WS-MakeStubs. Nie sądzę, że jest dostępny na iPhonie, ale możesz również zainteresować się biblioteką open source, która ma to zastąpić - kod generuje Objective-C do interakcji z klientem SOAP. Znowu go nie użyłem - ale zaznaczyłem to w swoich notatkach: wsdl2objc

heckj
źródło
Dzięki, próbowałem użyć wsdl2objc. Generowanie kodu ObjectiveC z WSDL działa, ale (zgodnie z oczekiwaniami) nie kompiluje się bezpośrednio z iPhone SDK. Próbowałem trochę ulepszyć źródła, ale skończyło się to wieloma błędami, których nie mogłem rozwiązać
Gero,
2

Możesz połączyć się za pomocą narzędzia, które znalazłem 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];
Bennya
źródło
2

Oto szybki przykładowy kod 4, który wykonuje wywołania API przy użyciu formatu usługi SOAP.

   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()
    }
Tech
źródło
0

Zobacz tutaj ten link i jego mapę drogową. Po drodze mają RO | C i mogą łączyć się z ich usługami internetowymi, które prawdopodobnie obejmują SOAP (używam wersji VCL, która zdecydowanie je zawiera).

mj2008
źródło
0

Spójrz na gsoap, który zawiera dwa przykłady iOS w pakiecie do pobrania pod ios_plugin. Narzędzie konwertuje WSDL na kod dla SOAP i XML REST.

Dr Alex RE
źródło