2008-10-15 5 views
221

iPhone 용 응용 프로그램을 개발할 계획이고 그 응용 프로그램은 몇 가지 SOAP 서비스에 액세스해야합니다. iPhone SDK에서 몇 가지 기본 검사를 수행하는 동안 SOAP 서비스 액세스에 대한 지원을 찾을 수 없었습니다. Google 검색의 일부는 iPhone SDK에 SOAP에 대한 지원이 없다는 결론을 이끌었습니다.iPhone에서 SOAP 서비스에 액세스하는 방법

그래서 내가 그 응용 프로그램을 만들고 싶다면 iPhone에서 SOAP 서비스에 액세스하는 접근법을 생각해 내야 할 것입니다. 최선의 접근 방법은 무엇입니까? 모범 사례? 누군가 이미 iPhone SDK에있는 기능을 사용하여 SOAP 서비스에 액세스하기 위해 라이브러리를 작성 했습니까?

(I 액세스가 필요로하는 서비스가 다른 자에 의해 노출 그들은 단지 SOAP로 노출되어 있기 때문에, 그것은 불행하게도 인터페이스 (예 : REST 기반 API)의 또 다른 유형으로 전환 할 수있는 옵션이 아니다.

게로

.
+9

안녕 게로, 무엇 비누 서비스 u는 UR 응용 프로그램에 사용했다. u는 답변을 언급하지 않았습니다. – Ameya

+3

서비스를 사용한 후에는 나중에 다른 사용자를 위해 튜토리얼을 게시하십시오. –

답변

0

그들은 RO을 가지고 here this link을보고 자신의 로드맵을 가지고 | C 길에, 그것은 아마 SOAP (나는 확실히 그것을 포함 VCL 버전을 사용)를 포함 자신의 웹 서비스에 연결할 수

51

. 한 단어 :하지 마세요.

분명히 그것은 진짜 대답이 아닙니다. 하지만 여전히 SOAP은 피해야합니다. ;-) iPhone과 웹 서비스간에 프록시 서버를 추가 할 수 있습니까? 아마도 당신을 위해 SOAP로 REST를 변환 뭔가?

CSOAP은 libxml2 (iPhone SDK에 포함되어 있음)에 의존하는 SOAP 라이브러리입니다.

OSX 용으로 SOAP framework을 작성했습니다. 그러나 적극적으로 유지 관리되지 않으며 iPhone으로 이식하는 데 약간의 시간이 필요합니다 (NSXML을 TouchXML으로 바꿔야합니다.)

+10

이 문장을 자세히 설명 할 수 있습니까? "하지만 여전히 SOAP은 피해야합니다." – WillF

+0

괜찮 으면이 설명과 함께 설명 할 것이 좋습니다. 또한 "REST를 SOAP로 변환한다"라고 말하면 JSON을 SOAP로 변환해야한다고 생각한다. 이 올바른지? – senfo

+2

그래, 또한 설명을 원해. "하지마"라고 말하면 iPhone/SOAP 문제에 대해 알고있는 특정 항목을 기반으로하는지 알고 싶습니다. 반대로 SOAP을 피하는 것이 일반적인 정상적인 이유라면 Google의 "SOAP vs REST"를 사용하여 소화제를 사용할 수 있습니다. –

4

나는 낮은 수준 (XML 생성 및 파싱) Objective-C에서 SOAP 스타일 요청을 수행해야하는 경우가 있습니다. 즉, 오픈 소스 (BSD 라이센스)이며 Google 코드 (mac-soapclient)에서 사용할 수있는 SOAPClient (soapclient)라는 라이브러리를 사용할 수 있습니다.

필자는 한번도 사용하지 않았거나 API로 작업해야했기 때문에 그 능력이나 효과를 증명하지는 않겠지 만, 필요에 따라 사용 가능한 솔루션을 제공 할 수도 있습니다.

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

+0

감사합니다. wsdl2objc를 사용하려고했습니다. WSDL에서 ObjectiveC 코드가 생성되지만 (예상대로) iPhone SDK에 대해 직접 컴파일되지 않습니다. 소스를 약간 조정하려고했지만 해결할 수없는 오류가 많았습니다. – Gero

7

내 솔루션은 프록시 서버가 REST를 받아들이고, SOAP 요청을 발행하고 PHP를 사용하여 결과를 반환하도록하는 것이었다.

구현 시간 : 15-30 분.

우아하지만 단단하지는 않습니다.

+4

어떻게 그랬습니까? 모든 서류. tnx – Spring

+2

나는 신비한 무응답을 좋아한다. 이걸 어떻게 상환 했니? – gdbj

+0

@gdbj REST와 SOAP 사이의 1 : 1 변환은 자체 설명이되어야하기 때문에 ... –

1

당신은 내가

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]; 
0

http://www.wsdl2code.com이 ios_plugin에서 다운로드 패키지에 두 개의 아이폰 OS 예제를 포함 gsoap에서보세요 발견 도구를 사용하여 연결할 수 있습니다. 이 도구는 WSDL을 SOAP 및 XML REST의 코드로 변환합니다.

0

여기에 SOAP 서비스 형식을 사용하여 API 호출을 실행하는 swift 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() 
    }