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

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

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

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

게로



답변

한마디 :하지 마십시오.

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

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

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


답변

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

구현 시간 : 15-30 분

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


답변

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

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

애플은 한때 WS-MakeStubs라는 매우 깨진 유틸리티를 가지고있었습니다. iPhone에서 사용할 수 있다고 생각하지 않지만 SOAP 클라이언트와 상호 작용하기 위해 Objective-C를 생성하는 코드를 대체하기위한 오픈 소스 라이브러리에 관심이있을 수 있습니다. 다시, 나는 그것을 사용하지 않았지만 내 노트에 표시했습니다 : wsdl2objc


답변

내가 찾은 도구를 사용하여 연결할 수 있습니다 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];


답변

다음은 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()
    }


답변

이 링크 와 로드맵을 살펴보십시오 . 그들은 RO | C를 가지고 있으며 SOAP를 포함하는 웹 서비스에 연결할 수 있습니다 (확실히 포함 된 VCL 버전을 사용합니다).


답변

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