Como acessar serviços SOAP do iPhone

224

Estou planejando desenvolver um aplicativo para o iPhone e esse aplicativo teria que acessar alguns serviços SOAP. Enquanto fazia uma verificação básica no iPhone SDK, não consegui encontrar suporte para acessar serviços SOAP, um pouco de pesquisa no Google levou à conclusão de que não há suporte para SOAP no iPhone SDK.

Portanto, se eu quiser criar esse aplicativo, precisarei criar uma abordagem para acessar os serviços SOAP do iPhone. Qual seria a melhor abordagem? Alguma prática recomendada? Alguém já escreveu uma biblioteca usando a funcionalidade presente no iPhone SDK para acessar os serviços SOAP?

(Como o serviço que preciso acessar é exposto por outra parte e o expõe apenas como SOAP, infelizmente não é uma opção alternar para outro tipo de interface (por exemplo, API baseada em REST).

Gero

Gero
fonte
9
Oi Gero, Qual serviço de sabão você usou para sua aplicação? como você não mencionou nenhuma resposta correta.
Ameya
3
Depois de usar o serviço, poste os tutoriais para referência futura em Outros.
Vineesh TP

Respostas:

52

Uma palavra: não.

OK, obviamente, essa não é uma resposta real. Mas o SOAP ainda deve ser evitado a todo custo. ;-) É possível adicionar um servidor proxy entre o iPhone e o serviço da web? Talvez algo que converta REST em SOAP para você?

Você pode experimentar o CSOAP , uma biblioteca SOAP que depende da libxml2 (incluída no iPhone SDK).

Eu escrevi minha própria estrutura SOAP para OSX. No entanto, ele não é mantido ativamente e exigirá algum tempo para ser portado para o iPhone (você precisará substituir o NSXML pelo TouchXML para começar)

schwa
fonte
11
Você pode elaborar esta afirmação "Mas o SOAP ainda deve ser evitado a todo custo" #
WillF
9
Só porque o sabão não é does not necessariamente apropriado significa que não é certo em sua implementação, há necessidades que vão além do melhor practive mais frequentemente do que não
Anthony Principais
11
@schwa - diminuiu o voto por postar uma resposta potencialmente útil com absolutamente nenhuma evidência ou defesa de apoio.
DougW
12
Esse é o equivalente técnico de "Não use porque não é fornecido por padrão" - Não há motivo técnico real para você não usar SOAP ou qualquer outro mecanismo fornecido por um serviço.
Petesh
9
Aqui está pelo menos uma resposta - SOAP é um protocolo de sobrecarga muito alta comparado ao REST. Todo o espaço para nome e verificação de validade adiciona uma tonelada de caracteres extras à sua mensagem, e é exatamente isso que você deseja evitar em uma rede potencialmente lenta e de alta latência, como 3G. Se você pode garantir que seu aplicativo será usado apenas em um ambiente 4G com excelente sinal ou apenas em Wifi, pode ser mais apropriado. Mas, em geral, com redes móveis, menos é mais.
Vineel Shah
7

Minha solução foi ter um servidor proxy aceitar REST, emitir a solicitação SOAP e retornar o resultado usando PHP.

Tempo para implementar: 15 a 30 minutos.

Não é mais elegante, mas sólido.

davidjhinson
fonte
4
Como você fez isso? quaisquer documentos. tnx
Spring
3
Eu amo a misteriosa não resposta. como isso foi votado?
Gdbj # 24/15
@gdbj porque um 1: conversão de 1 entre REST e sabão deve ser auto-explanitory ...
Magia Octopus Urna
1
Esse é o quê, mas não responde à pergunta de como, e é por isso que as pessoas vêm aqui. Ainda estou curioso sobre a resposta sobre qual seria a implementação aqui, principalmente se for tão simples.
Gdbj
4

Historicamente, rolei meu próprio acesso em um nível baixo (geração e análise de XML) para lidar com a necessidade ocasional de fazer solicitações de estilo SOAP do Objective-C. Dito isto, há uma biblioteca disponível chamada SOAPClient ( soapclient ) que é de código aberto (licenciado por BSD) e disponível no Google Code ( mac-soapclient ) que pode ser interessante.

Não atestarei suas habilidades ou eficácia, pois nunca o usei ou tive que trabalhar com suas APIs, mas ele está disponível e pode fornecer uma solução rápida para você, dependendo de suas necessidades.

A Apple tinha, ao mesmo tempo, um utilitário muito quebrado chamado WS-MakeStubs. Eu não acho que esteja disponível no iPhone, mas você também pode estar interessado em uma biblioteca de código aberto que pretende substituir isso - o código gera o Objective-C para interagir com um cliente SOAP. Novamente, eu não o usei - mas marquei-o nas minhas anotações: wsdl2objc

heckj
fonte
Obrigado, tentei usar o wsdl2objc. A geração do código ObjectiveC a partir do WSDL funciona, mas é (conforme o esperado) não compilada diretamente no iPhone SDK. Tentei ajustar um pouco as fontes, mas acabei com um monte de erros que não consegui resolver.
Gero 18/10/08
2

Você pode se conectar usando uma ferramenta que eu encontrei 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];
Bennya
fonte
2

Aqui está um código de amostra rápido 4 que executa chamadas de API usando o formato de serviço 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()
    }
Tecnologia
fonte
0

Veja aqui este link e seu roteiro. Eles têm RO | C a caminho e podem se conectar aos seus serviços da web, o que provavelmente inclui SOAP (eu uso a versão VCL que definitivamente inclui).

mj2008
fonte
0

Dê uma olhada no gsoap que inclui dois exemplos de iOS no pacote de download em ios_plugin. A ferramenta converte o WSDL em código para SOAP e XML REST.

Dr. Alex RE
fonte