Cách truy cập dịch vụ SOAP từ iPhone


224

Tôi đang lên kế hoạch phát triển một ứng dụng cho iPhone và ứng dụng đó sẽ phải truy cập vào một vài dịch vụ SOAP. Trong khi thực hiện một số kiểm tra cơ bản trong SDK iPhone, tôi không thể tìm thấy bất kỳ sự hỗ trợ nào để 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ó hỗ trợ cho SOAP trong SDK iPhone.

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

(Vì dịch vụ tôi cần truy cập bị một bên khác tiết lộ và họ chỉ hiển thị nó dưới dạng SOAP, thật không may, không phải là một tùy chọn để chuyển sang loại giao diện khác (ví dụ API dựa trên REST).

Gero


9
Xin chào Gero, bạn đã sử dụng dịch vụ xà phòng nào cho ứng dụng của bạn. như bạn đã không đề cập 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 trong tương lai cho những người khác.
Vineesh TP

Câu trả lời:


52

Một từ: Đừng.

Rõ ràng đó không phải là một câu trả lời thực sự. Nhưng vẫn nên tránh SOAP bằng mọi giá. ;-) Có thể thêm máy chủ proxy giữa iPhone và dịch vụ web không? Có lẽ một 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 khung SOAP của riêng mình cho OSX. Tuy nhiên, nó không được duy trì tích cực và sẽ cần một chút thời gian để chuyển sang iPhone (bạn sẽ cần thay NSXML bằng TouchXML để bắt đầu)


11
Bạn có thể nói rõ hơn về tuyên bố này "Nhưng vẫn nên tránh SOAP bằng mọi giá"
WillF

9
Chỉ cần xà phòng không nhất thiết phải phù hợp không có nghĩa là nó không đúng trong quá trình thực hiện của anh ta, có những nhu cầu vượt quá khả năng thực hành tốt nhất thường xuyên hơn không
Anthony Main

11
@schwa - Bị từ chối vì đã đăng một câu trả lời có khả năng hữu ích mà hoàn toàn không có bằng chứng hỗ trợ hoặc biện hộ.
DougW

12
Đây là tương đương về mặt kỹ thuật của "Không sử dụng vì nó không được cung cấp theo mặc định" - Không có lý do kỹ thuật thực sự nào khiến bạn không nên sử dụng SOAP hoặc bất kỳ cơ chế nào khác được cung cấp bởi một dịch vụ.
Petesh

9
Đây ít nhất là một câu trả lời-- SOAP là một giao thức có chi phí rất cao so với REST. Tất cả các kiểm tra không gian tên và tính hợp lệ và như vậy sẽ thêm một tấn ký tự phụ vào tin nhắn của bạn và đây chính xác là những gì bạn muốn tránh trong một mạng có độ trễ cao, có khả năng chậm, chẳng hạn như 3G. Nếu bạn có thể đảm bảo rằng ứng dụng của bạn sẽ chỉ được sử dụng trong môi trường 4g với tín hiệu tuyệt vời hoặc chỉ trong Wifi, nó có thể bị khủng bố nhiều hơn. Nhưng nói chung với mạng di động, ít hơn là nhiều hơn.
Vineel

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ả, sử dụng PHP.

Thời gian thực hiện: 15-30 phút.

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


4
Làm thế nào bạn có điều đó? bất kỳ tài liệu. tnx
mùa xuân

3
Tôi yêu câu trả lời không bí ẩn. Làm thế nào điều này được nâng cấp?
gdbj

@gdbj vì chuyển đổi 1: 1 giữa REST và SOAP nên tự giải thích ...
Bạch tuộc ma thuật Urn

1
Đó là Cái gì, nhưng không trả lời câu hỏi Làm thế nào, đó là lý do tại sao mọi người đến đây. Tôi vẫn tò mò về câu trả lời về việc triển khai sẽ ở đây, đặc biệt nếu nó quá đơn giản.
gdbj

4

Trước đây, tôi đã sử dụng quyền truy cập của riêng mình ở mức độ thấp (tạo và phân tích cú pháp XML) để giải quyết nhu cầu thỉnh thoảng 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 ( xà phòng ) là nguồn mở (được cấp phép BSD) và có sẵn trên Google Code ( mac-soapclient ) 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 nó 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.

Tại một thời điểm, Apple đã có một tiện ích rất bị hỏng gọi là WS-MakeStub. 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 nguồn mở nhằm thay thế điều đó - mã tạo ra Objective-C để tương tác với 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 mình: wsdl2objc


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

2

Bạn có thể kết nối bằ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];

2

Dưới đây là mã mẫu 4 nhanh chóng thực hiện lệnh gọi API bằ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()
    }

0

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


0

Hãy xem gsoap bao gồm hai ví dụ iOS trong gói tải xuống dưới ios_plugin. Công cụ chuyển đổi WSDL thành mã cho SOAP và XML REST.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.