iPhone에서 SOAP 서비스에 액세스하는 방법


224

iPhone 용 앱을 개발할 계획이며 해당 앱은 몇 가지 SOAP 서비스에 액세스해야합니다. iPhone SDK에서 몇 가지 기본 검사를 수행하는 동안 SOAP 서비스 액세스에 대한 지원을 찾을 수 없었습니다. 약간의 인터넷 검색으로 인해 iPhone SDK에 SOAP가 지원되지 않는다는 결론이 나왔습니다.

따라서 해당 응용 프로그램을 빌드하려면 iPhone에서 SOAP 서비스에 액세스하는 방법을 생각해 내야합니다. 가장 좋은 방법은 무엇입니까? 모범 사례가 있습니까? 누군가가 이미 SOAP 서비스에 액세스하기 위해 iPhone SDK에있는 기능을 사용하여 라이브러리를 작성 했습니까?

(내가 액세스해야하는 서비스는 다른 당사자에 의해 노출되고 SOAP으로 만 노출되기 때문에 불행히도 다른 유형의 인터페이스 (예 : REST 기반 API)로 전환하는 옵션은 아닙니다.

게로


9
안녕하세요 게로, 당신은 어떤 비누 서비스를 당신의 응용 프로그램에 사용 했습니까? 당신은 정답을 언급하지 않았기 때문에.
Ameya

3
서비스를 사용한 후 나중에 기타를 참조 할 수 있도록 자습서를 게시하십시오.
Vineesh TP

답변:


52

한마디 :하지 마십시오.

물론 그것은 실제 답변이 아닙니다. 그러나 여전히 모든 비용으로 SOAP를 피해야합니다. ;-) iPhone과 웹 서비스 사이에 프록시 서버를 추가 할 수 있습니까? 아마도 REST를 SOAP로 변환하는 것이 있습니까?

libxml2 (iPhone SDK에 포함되어 있음)에 의존하는 SOAP 라이브러리 인 CSOAP를 사용해 볼 있습니다.

OSX를위한 자체 SOAP 프레임 워크 를 작성했습니다 . 그러나 적극적으로 유지 관리되지 않으며 iPhone으로 이식하는 데 약간의 시간이 필요합니다 ( 시작 하려면 NSXML을 TouchXML 로 교체해야 함 )


11
"하지만 여전히 모든 비용으로 SOAP를 피해야합니다"
WillF

9
비누가 반드시 적절하지 않다고해서 반드시 그의 구현에 적합하지 않다는 의미는 아닙니다. 최선의 능동적 인 행동을 넘어서야하는 경우가 더 많습니다.
Anthony Main

11
@schwa-증거 나 방어 수단이 전혀없이 잠재적으로 유용한 답변을 게시 한 것으로 알려졌습니다.
DougW

12
이것은 "기본적으로 제공되지 않기 때문에 사용하지 마십시오"와 동등한 기술입니다.-SOAP 또는 서비스가 제공하는 다른 메커니즘을 사용해서는 안되는 실제적인 기술적 이유는 없습니다.
Petesh

9
적어도 대답은 SOAP입니다. SOAP는 REST에 비해 매우 높은 오버 헤드 프로토콜입니다. 모든 네임 스페이스 및 유효성 검사 및 기타 기능은 메시지에 추가로 많은 문자를 추가하며 이는 3G와 같이 대기 시간이 길고 잠재적으로 느린 네트워크를 통해 피하려는 것입니다. 앱이 신호가 우수한 4g 환경에서만 사용되거나 Wifi에서만 사용되도록 보장하는 것이 더 적절할 수 있습니다. 그러나 일반적으로 모바일 네트워킹의 경우 더 적습니다.
Vineel Shah

7

내 솔루션은 프록시 서버가 REST를 수락하고 SOAP 요청을 발행하고 PHP를 사용하여 결과를 반환하도록하는 것입니다.

구현 시간 : 15-30 분

가장 우아하지는 않지만 단단합니다.


4
어떻게 했어? 모든 문서. tnx

3
나는 신비한 비 응답을 좋아합니다. 이것은 어떻게 공표 되었습니까?
gdbj

REST와 SOAP 사이의 1 : 1 변환은 자명 해져야하기 때문에 @gdbj ...
Magic Octopus Urn

1
그것이 무엇입니까, 그러나 사람들이 여기에 오는 이유에 대한 질문에 대답하지 않습니다. 구현이 무엇인지, 특히 그것이 매우 간단한 경우에 대한 답변에 여전히 궁금합니다.
gdbj

4

나는 역사적으로 Objective-C에서 SOAP 스타일 요청을 수행 해야하는 필요성을 처리하기 위해 저수준 (XML 생성 및 구문 분석)에서 내 자신의 액세스 권한을 롤업했습니다. 즉, 오픈 소스 (BSD 라이센스)이며 관심을 가질만한 Google 코드 ( mac-soapclient )에서 사용할 수있는 SOAPClient ( soapclient ) 라는 라이브러리 가 있습니다.

나는 그것을 사용하지 않았거나 API로 작업해야했기 때문에 그 기능이나 효과에 대해 증명하지는 않지만 가능하며 필요에 따라 빠른 솔루션을 제공 할 수 있습니다.

애플은 한때 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를 포함하는 웹 서비스에 연결할 수 있습니다 (확실히 포함 된 VCL 버전을 사용합니다).


0

ios_plugin의 다운로드 패키지에 두 가지 iOS 예제가 포함 된 gsoap 을 살펴보십시오 . 이 도구는 WSDL을 SOAP 및 XML REST 용 코드로 변환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.