我在这里相当新..我运行了一个tomcat服务器,并且有一个Web服务方法,在调用该方法时会返回一个字符串。当我尝试使用

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];

// URL Request

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:
 [NSURL URLWithString:@"http://localhost:8080/WebServiceTutorialClient/sampleHelloProxy/Input.jsp?method=18"]];

[request setHTTPMethod:@"POST"];
// Send Request


[NSURLConnection sendAsynchronousRequest:request
                                   queue:backgroundQueue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
                           NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                           NSLog(@"%@", result);
                       }];


我只是获取页面的内容,而不是该方法应该返回的字符串。这看起来很愚蠢,但我不知道如何获取该字符串。我确实获得了成功的响应(当我看到NSLog响应对象时),但是我认为它只是包含了无论如何我都会返回的html数据。

我该如何从我的tomcat服务器调用该方法,并将字符串返回给我?非常感谢您的宝贵时间!

编辑:这是记录的响应:

<HTML>
<HEAD>
<TITLE>Inputs</TITLE>
</HEAD>
<BODY>
<H1>Inputs</H1>


<FORM METHOD="POST" ACTION="Result.jsp" TARGET="result">
<INPUT TYPE="HIDDEN" NAME="method" VALUE="18">
<BR>
<INPUT TYPE="SUBMIT" VALUE="Invoke">
<INPUT TYPE="RESET" VALUE="Clear">
</FORM>


</BODY>
</HTML>


编辑2:这是hello服务图。如何通过代码调用特定方法?

最佳答案

正如我们在聊天中所讨论的那样,原始问题中的代码将HTML用户界面与实际的Web服务本身结合起来,用于测试Web服务。您的示例代码正在对用于测试Web服务的HTML页面发出HTTP请求。您可能真的想直接与Web服务进行交互。

话虽这么说,使用SOAP / WSDL Web服务接口会使过程相当复杂。在How to access SOAP services from iPhone讨论中,我同意schwa的结论:“不要”。更重要的是,如果您要编写一个新的Web服务,则一些提供JSON的REST服务将更容易使用。或者,如果您坚持使用基于SOAP的服务,则可以编写一个使用SOAP服务并提供JSON的新Web服务。

如果您确实希望iOS应用程序直接与特定WSDL定义的SOAP服务进行交互,则似乎有两种方法:首先,可以使用一种源代码生成器(例如sudzc.com)。此类解决方案使我不知所措。其次,您可以使用Soap UI之类的工具为请求手动创建XML,然后将其用作iOS中的模板。

因此,我尝试了后一种方法:


您提到您遵循了the tutorial。实际上,我发现this article在使Web服务运行方面更有用,但是如果您成功使用了前者,那很好。
我创建了一个Web服务HelloTest,该类的Hello类具有一个方法sayHello,该方法带有一个参数name,并返回"Hello " + name

package com.tutorial;

public class Hello {
    public String sayHello(String name){
        return "Hello " + name;
    }
}

我让Eclipse为我生成了WSDL。这些细节没有意思,但与您的并不完全不同:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://tutorial.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tutorial.com">
    <wsdl:documentation>
        Please Type your service description here
    </wsdl:documentation>
    <wsdl:types>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://tutorial.com">
            <xs:element name="sayHello">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="sayHelloResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="sayHelloRequest">
        <wsdl:part name="parameters" element="ns:sayHello"/>
    </wsdl:message>
    <wsdl:message name="sayHelloResponse">
        <wsdl:part name="parameters" element="ns:sayHelloResponse"/>
    </wsdl:message>
    <wsdl:portType name="HelloPortType">
        <wsdl:operation name="sayHello">
            <wsdl:input message="ns:sayHelloRequest" wsaw:Action="urn:sayHello"/>
            <wsdl:output message="ns:sayHelloResponse" wsaw:Action="urn:sayHelloResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="HelloSoap11Binding" type="ns:HelloPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="sayHello">
            <soap:operation soapAction="urn:sayHello" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="HelloSoap12Binding" type="ns:HelloPortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="sayHello">
            <soap12:operation soapAction="urn:sayHello" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="HelloHttpBinding" type="ns:HelloPortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="sayHello">
            <http:operation location="sayHello"/>
            <wsdl:input>
                <mime:content type="application/xml" part="parameters"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="application/xml" part="parameters"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="Hello">
        <wsdl:port name="HelloHttpSoap11Endpoint" binding="ns:HelloSoap11Binding">
            <soap:address location="http://localhost:8080/HelloTest/services/Hello.HelloHttpSoap11Endpoint/"/>
        </wsdl:port>
        <wsdl:port name="HelloHttpSoap12Endpoint" binding="ns:HelloSoap12Binding">
            <soap12:address location="http://localhost:8080/HelloTest/services/Hello.HelloHttpSoap12Endpoint/"/>
        </wsdl:port>
        <wsdl:port name="HelloHttpEndpoint" binding="ns:HelloHttpBinding">
            <http:address location="http://localhost:8080/HelloTest/services/Hello.HelloHttpEndpoint/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

我使用Soap UI来获取WSDL并创建示例请求。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tut="http://tutorial.com">
    <soap:Header/>
    <soap:Body>
        <tut:sayHello>
            <!--Optional:-->
            <tut:name>Rob</tut:name>
        </tut:sayHello>
    </soap:Body>
</soap:Envelope>


它可能对我的配置来说是唯一的,但是我不得不尝试使用由Soap UI生成的SOAP信封,代替SOAP 1.2 URI:

http://www.w3.org/2003/05/soap-envelope


使用SOAP 1.1 URI:

http://schemas.xmlsoap.org/soap/envelope/


出于示例目的,我还用“ Rob”替换了?占位符(因为我希望我的Web服务向我问好)。
无论如何,我现在可以通过以下Objective-C代码在iOS中提交该请求:

NSURL *url = [NSURL URLWithString:@"http://localhost:8080/HelloTest/services/Hello"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

NSString *filename = [[NSBundle mainBundle] pathForResource:@"request1" ofType:@"xml"];
NSData *requestBodyData = [NSData dataWithContentsOfFile:filename];
request.HTTPBody = requestBodyData;

[request setHTTPMethod:@"POST"];
[request addValue:@"http://tutorial.com" forHTTPHeaderField:@"SOAPAction"];
[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                           NSLog(@"%s", __FUNCTION__);
                           if (data)
                           {
                               NSLog(@"%@", [[NSString alloc] initWithData:data
                                                                  encoding:NSUTF8StringEncoding]);
                           }
                       }];


显然,使用请求创建NSData的方式可能有所不同(为保持此“简单”,我将SOAP请求的XML放入了一个名为request1.xml的文本文件中,并将其包含在我的捆绑包中)。同样,可以如何发起请求(我使用了NSURLConnection方法,sendAsynchronousRequest)。但是希望这可以使您了解如何发送手动创建的SOAP请求。
生成的响应看起来像(我已经美化了,但这是响应):

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns:sayHelloResponse xmlns:ns="http://tutorial.com">
            <ns:return>Hello Rob</ns:return>
        </ns:sayHelloResponse>
    </soapenv:Body>
</soapenv:Envelope>


然后,您可以使用XML解析器(例如NSXMLParser)解析此答案。


对我来说,“带回家”的信息是,除非绝对必要,否则我不会这样做。我认为JSON Web服务很容易创建,并且在iOS中使用它们的响应要容易得多。

09-26 21:46