2008-10-15 44 views
221

Tôi đang lập kế hoạch phát triển một ứng dụng cho iPhone và ứng dụng đó sẽ phải truy cập một vài dịch vụ SOAP. Trong khi thực hiện một số kiểm tra cơ bản trong iPhone SDK, tôi không thể tìm thấy bất kỳ hỗ trợ nào cho việc truy cập các dịch vụ SOAP, một chút Googling dẫn đến kết luận rằng không có sự hỗ trợ cho SOAP trong SDK iPhone.Cách truy cập các dịch vụ SOAP từ iPhone

Vì vậy, nếu tôi muốn xây dựng ứng dụng đó, tôi sẽ cần phải đưa ra một cách tiếp cận để truy cập các dịch vụ SOAP từ iPhone. Cách tiếp cận tốt nhất là gì? Bất kỳ phương pháp hay nhất nào? Đã có ai đó đã viết một thư viện bằng cách sử dụng chức năng hiện diện trong iPhone SDK để truy cập các dịch vụ SOAP?

(Kể từ khi dịch vụ tôi cần phải truy cập được tiếp xúc bởi một bên khác và họ chỉ phơi bày nó như SOAP, nó tiếc là không một tùy chọn để chuyển sang một loại giao diện (ví dụ như REST dựa trên API).

Gero

+9

Hi Gero, Dịch vụ xà phòng nào bạn sử dụng cho ứng dụng ur. như u đã không đề cập đến bất kỳ câu trả lời chính xác. – Ameya

+3

Sau khi bạn sử dụng dịch vụ, vui lòng đăng các hướng dẫn để tham khảo sau này cho Người khác. –

Trả lời

0

có một cái nhìn tại here this link và lộ trình của họ họ có RO |. C trên đường đi, và có thể kết nối với các dịch vụ web của họ, mà có lẽ bao gồm SOAP (tôi sử dụng phiên bản VCL mà chắc chắn bao gồm nó)

51

. Một từ: Đừng.

OK rõ ràng đó không phải là câu trả lời thực sự. Nhưng SOAP vẫn nên tránh bằng mọi giá. ;-) Có thể thêm một máy chủ proxy giữa iPhone và dịch vụ web không? Có lẽ cái gì đó chuyển đổi REST thành SOAP cho bạn?

Bạn có thể thử CSOAP, thư viện SOAP phụ thuộc vào libxml2 (được bao gồm trong SDK iPhone).

Tôi đã viết riêng SOAP framework cho OSX của mình. Tuy nhiên, nó không được duy trì tích cực và sẽ cần một thời gian để chuyển sang iPhone (bạn cần phải thay thế NSXML bằng TouchXML để bắt đầu)

+10

Bạn có thể xây dựng trên tuyên bố này "Nhưng vẫn SOAP nên tránh bằng mọi giá" – WillF

+0

Nếu bạn không phiền, tôi thực sự muốn một lời giải thích để đi cùng với phản ứng này. Ngoài ra, khi bạn nói "chuyển đổi REST thành SOAP cho bạn", tôi nghĩ bạn có nghĩa là chuyển đổi JSON thành SOAP. Điều này có đúng không? – senfo

+2

Vâng, cũng muốn giải thích. Nếu bạn chỉ nói "Không", tôi muốn biết nếu bạn đang dựa trên một cái gì đó cụ thể mà bạn biết về iPhone/SOAP vấn đề. Mặt khác, nếu nó chỉ là những lý do bình thường, chung để tránh SOAP, tôi có thể Google "SOAP vs REST" và nhận được một cái miệng đầy giận dữ về điều đó. –

4

Tôi đã truy cập lịch sử của riêng mình ở mức thấp (tạo XML và phân tích cú pháp) để đối phó với nhu cầu thường xuyên thực hiện các yêu cầu kiểu SOAP từ Objective-C. Điều đó nói rằng, có một thư viện có tên SOAPClient (soapclient) là mã nguồn mở (BSD được cấp phép) và có sẵn trên Google Code (mac-soapclient) mà có thể được quan tâm.

Tôi sẽ không chứng thực khả năng hoặc hiệu quả của nó, vì tôi chưa bao giờ sử dụng hoặc phải làm việc với API của nó, nhưng nó có sẵn và có thể cung cấp giải pháp nhanh chóng cho bạn tùy theo nhu cầu của bạn.

Apple đã từng có một tiện ích rất bị hỏng gọi là WS-MakeStubs. Tôi không nghĩ rằng nó có sẵn trên iPhone, nhưng bạn cũng có thể quan tâm đến một thư viện mã nguồn mở nhằm thay thế mã đó tạo ra Objective-C để tương tác với một máy khách SOAP. Một lần nữa, tôi đã không sử dụng nó - nhưng tôi đã đánh dấu nó trong ghi chú của tôi - wsdl2objc

+0

Cảm ơn, tôi đã cố gắng sử dụng wsdl2objc. Việc tạo mã ObjectiveC từ các công trình WSDL, nhưng (như mong đợi) không biên dịch trực tiếp với iPhone SDK. Tôi đã cố gắng để tinh chỉnh các nguồn một chút, nhưng kết thúc với một loạt các lỗi tôi không thể giải quyết – Gero

7

Giải pháp của tôi là có một máy chủ proxy chấp nhận REST, đưa ra yêu cầu SOAP và trả về kết quả bằng cách sử dụng PHP.

Thời gian triển khai: 15-30 phút.

Không thanh lịch nhất, nhưng chắc chắn.

+4

Làm thế nào mà bạn? bất kỳ tài liệu nào. tnx – Spring

+2

Tôi thích câu trả lời bí ẩn. làm thế nào là điều này upvoted? – gdbj

+0

@gdbj vì chuyển đổi 1: 1 giữa REST và SOAP phải tự giải thích ... –

1

Bạn có thể kết nối sử dụng một công cụ mà tôi tìm thấy 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]; 
0

Có một cái nhìn tại gsoap bao gồm hai ví dụ iOS trong gói tải về dưới ios_plugin. Công cụ chuyển đổi WSDL thành mã cho SOAP và XML REST.

0

Dưới đây là swift 4 mã mẫu thực thi cuộc gọi API sử dụng định dạng dịch vụ 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() 
    } 
Các vấn đề liên quan