วิธีเข้าถึงบริการ SOAP จาก iPhone


224

ฉันวางแผนที่จะพัฒนาแอพสำหรับ iPhone และแอพนั้นจะต้องเข้าถึงบริการ SOAP สองสามอย่าง ในขณะที่ทำการตรวจสอบขั้นพื้นฐานบางอย่างใน iPhone SDK ฉันไม่สามารถค้นหาการสนับสนุนใด ๆ สำหรับการเข้าถึงบริการ SOAP ได้บ้าง Googling นำไปสู่ข้อสรุปว่าไม่มีการสนับสนุน SOAP ใน iPhone SDK

ดังนั้นหากฉันต้องการสร้างแอพนั้นฉันจะต้องหาวิธีในการเข้าถึงบริการ SOAP จาก iPhone อะไรคือแนวทางที่ดีที่สุด แนวทางปฏิบัติที่ดีที่สุด มีใครบางคนเขียนห้องสมุดโดยใช้ฟังก์ชั่นที่มีอยู่ใน iPhone SDK เพื่อเข้าถึงบริการ SOAP หรือไม่?

(เนื่องจากบริการที่ฉันต้องการเข้าถึงนั้นถูกเปิดเผยโดยบุคคลอื่นและพวกเขาเปิดเผยเป็น SOAP เท่านั้นดังนั้นจึงไม่ใช่ตัวเลือกในการเปลี่ยนไปใช้อินเทอร์เฟซชนิดอื่น (เช่น REST based API)

Gero


9
สวัสดี Gero บริการสบู่อะไรที่คุณใช้สำหรับการสมัคร ในขณะที่คุณยังไม่ได้พูดคำตอบที่ถูกต้อง
Ameya

3
หลังจากที่คุณใช้บริการกรุณาโพสต์บทช่วยสอนสำหรับการอ้างอิงในอนาคตสำหรับผู้อื่น
Vineesh TP

คำตอบ:


52

หนึ่งคำ: ไม่

ตกลงอย่างชัดเจนว่าไม่ใช่คำตอบที่แท้จริง แต่ยังคงควรหลีกเลี่ยงสบู่ที่ค่าใช้จ่ายทั้งหมด ;-) เป็นไปได้หรือไม่ที่จะเพิ่มพร็อกซีเซิร์ฟเวอร์ระหว่าง iPhone และบริการเว็บ บางทีสิ่งที่แปลง REST เป็น SOAP สำหรับคุณ

คุณสามารถลองCSOAPไลบรารี SOAP ที่ขึ้นอยู่กับ libxml2 (ซึ่งรวมอยู่ใน iPhone SDK)

ฉันได้เขียนกรอบ SOAPของตัวเองสำหรับ OSX อย่างไรก็ตามมันจะไม่ได้รับการบำรุงรักษาและจะต้องใช้เวลาพอสมควรในการย้ายไปยัง iPhone (คุณจะต้องเปลี่ยน NSXML ด้วยTouchXMLเพื่อเริ่มต้น)


11
คุณสามารถทำอย่างละเอียดในคำสั่งนี้ "แต่ยังคง SOAP ควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด"
WillF

9
เพียงแค่ทำให้สบู่ไม่จำเป็นต้องเหมาะสมไม่ได้หมายความว่ามันไม่ถูกต้องในการใช้งานของเขามีความต้องการที่ไปไกลกว่าการปฏิบัติที่ดีที่สุดบ่อยกว่าไม่
Anthony Main

11
@schwa - ลงคะแนนสำหรับการโพสต์คำตอบที่อาจเป็นประโยชน์โดยไม่มีหลักฐานสนับสนุนหรือการป้องกันอย่างแน่นอน
DougW

12
นี่คือเทียบเท่าทางเทคนิคของ "อย่าใช้เพราะไม่ได้ให้ไว้โดยค่าเริ่มต้น" - ไม่มีเหตุผลทางเทคนิคที่แท้จริงว่าทำไมคุณไม่ควรใช้ SOAP หรือกลไกอื่น ๆ ที่ให้บริการ
Petesh

9
นี่คือคำตอบอย่างน้อย - SOAP เป็นโปรโตคอลค่าใช้จ่ายสูงมากเมื่อเทียบกับ REST การกำหนดเนมสเปซและการตรวจสอบความถูกต้องทั้งหมดและเพิ่มจำนวนอักขระพิเศษให้กับข้อความของคุณและนี่คือสิ่งที่คุณต้องการหลีกเลี่ยงในเครือข่ายที่มีความล่าช้าสูงและอาจช้าเช่น 3G หากคุณสามารถรับประกันได้ว่าแอปของคุณจะใช้งานในสภาพแวดล้อม 4g พร้อมสัญญาณที่ดีเยี่ยมหรือเฉพาะใน Wifi เท่านั้นอาจเป็นเรื่องที่น่าตกใจมากกว่า แต่โดยทั่วไปแล้วกับระบบเครือข่ายมือถือจะมีน้อยมาก
Vineel Shah

7

โซลูชันของฉันคือให้พร็อกซีเซิร์ฟเวอร์ยอมรับ REST ออกคำขอ SOAP และส่งคืนผลลัพธ์โดยใช้ PHP

เวลาที่จะดำเนินการ: 15-30 นาที

ไม่หรูหราที่สุด แต่แข็ง


4
คุณเป็นอย่างไร เอกสารใด ๆ tnx
สปริง

3
ฉันรักคำตอบที่ลึกลับ upvoted นี้เป็นอย่างไร
gdbj

@gdbj เนื่องจากการแปลง 1: 1 ระหว่าง REST และ SOAP ควรเป็นการอธิบายตนเอง ...
Magic Octopus Urn

1
นั่นคือสิ่งที่ แต่ไม่ตอบคำถามของวิธีซึ่งเป็นสาเหตุที่ผู้คนมาที่นี่ ฉันยังสงสัยเกี่ยวกับคำตอบว่าการใช้งานจะเป็นอย่างไรโดยเฉพาะอย่างยิ่งถ้ามันง่ายมาก
gdbj

4

ฉันได้ย้อนอดีตการเข้าถึงของฉันเองในระดับต่ำ (การสร้าง XML และการแยกวิเคราะห์) เพื่อจัดการกับความต้องการเป็นครั้งคราวเพื่อทำคำขอสไตล์ SOAP จาก Objective-C ที่กล่าวว่ามีห้องสมุดที่เรียกว่า SOAPClient ( soapclient ) ที่เป็นโอเพนซอร์ส (ได้รับอนุญาต BSD) และมีอยู่ใน Google Code ( mac-soapclient ) ที่อาจเป็นที่สนใจ

ฉันจะไม่ยืนยันถึงความสามารถหรือประสิทธิภาพของมันเพราะฉันไม่เคยใช้มันหรือต้องทำงานกับ API ของมัน แต่มันพร้อมใช้งานและอาจมอบวิธีแก้ปัญหาที่รวดเร็วสำหรับคุณขึ้นอยู่กับความต้องการของคุณ

Apple เคยใช้งาน WS-MakeStubs เป็นครั้งคราว ฉันไม่คิดว่ามันมีอยู่ใน iPhone แต่คุณอาจสนใจห้องสมุดโอเพ่นซอร์สที่ต้องการแทนที่ - โค้ดสร้าง Objective-C สำหรับการโต้ตอบกับไคลเอนต์ SOAP อีกครั้งฉันไม่ได้ใช้มัน - แต่ฉันได้ทำเครื่องหมายไว้ในบันทึกย่อของฉัน: wsdl2objc


ขอบคุณฉันพยายามใช้ wsdl2objc การสร้างรหัส ObjectiveC จาก WSDL ใช้งานได้ แต่เป็น (ตามที่คาดไว้) ไม่ได้รวบรวมโดยตรงกับ 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

นี่คือตัวอย่างรหัสswift 4ที่เรียกใช้การเรียก API โดยใช้รูปแบบบริการ 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

ดูที่นี่ลิงค์นี้และแผนงานของพวกเขา พวกเขามี RO | C ระหว่างทางและที่สามารถเชื่อมต่อกับบริการเว็บของพวกเขาซึ่งอาจรวมถึง SOAP (ฉันใช้รุ่น VCL ซึ่งรวมถึงแน่นอน)


0

ดูgsoapที่มีตัวอย่าง iOS สองตัวอย่างในแพ็คเกจดาวน์โหลดภายใต้ ios_plugin เครื่องมือแปลง WSDL เป็นรหัสสำหรับ SOAP และ XML REST

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.