我是相当新的...我有一个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);
}];
我只是获取页面的内容,而不是该方法应该返回的字符串。这看起来很傻但我不知道如何获得那个字符串。我确实得到了响应成功(当我看到NSGB响应对象时),但我认为它只包含我得到的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服务图。我如何通过代码调用特定的方法?
答案 0 :(得分:0)
正如我们在聊天中讨论的那样,原始问题中的代码将用于测试Web服务的HTML用户界面与实际的Web服务本身混为一谈。您的示例代码正在发出用于测试Web服务的HTML页面的HTTP请求。您可能真的想直接与您的Web服务进行交互。
话虽如此,使用SOAP / WSDL Web服务接口使得该过程非常复杂。在How to access SOAP services from iPhone讨论中,我同意schwa的结论:“不要”。更重要的是,如果您正在编写新的Web服务,那么提供JSON的一些REST服务将更容易使用。或者,如果您坚持使用基于SOAP的服务,则可以编写一个新的Web服务,该服务使用SOAP服务并提供JSON。
如果您真的希望iOS应用程序直接与特定WSDL定义的SOAP服务交互,似乎有两种方法:首先,您可以使用其中一个源代码生成器(如sudzc.com) 。我对这类解决方案感到不知所措。其次,您可以使用Soap UI之类的工具为请求手动创建XML
,然后将其用作iOS中的模板。
所以,我尝试了后一种方法:
您提到您已关注the tutorial。我实际上发现this article对于获取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”(因为我希望我的网络服务向我问好)。
无论如何,我现在可以通过以下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中使用它们的响应要容易得多。