您的位置:首页 > 移动开发 > IOS开发

iphone ios 用xcode4.2开发 访问web service的功能

2013-02-28 17:20 337 查看
1。后台利用 cxf 构建一个web service服务。

HelloWorld.java

[java] view
plaincopy

/**

*

*/

package com.alcor.jws.test;

import javax.jws.WebMethod;

import javax.jws.WebService;

import org.apache.cxf.feature.Features;

/**

* @author 徐泽宇(roamer)

*

* 2010-7-10

*/

@WebService

@Features(features = "org.apache.cxf.feature.LoggingFeature")

public interface HelloWorld {

@WebMethod

String sayHi(String text);

@WebMethod

boolean userLogon(String username,String userpasswd);

}

HelloWorldImpl.java

[java] view
plaincopy

/**

*

*/

package com.alcor.jws.test;

import org.apache.cxf.feature.Features;

import org.apache.log4j.Logger;

import javax.jws.WebMethod;

import javax.jws.WebService;

/**

* @author 徐泽宇(roamer)

*

* 2010-7-10

*/

@WebService

@Features(features = "org.apache.cxf.feature.LoggingFeature")

public class HelloWorldImpl implements HelloWorld {

/**

* Logger for this class

*/

private static final Logger logger = Logger.getLogger(HelloWorldImpl.class);

@WebMethod

public String sayHi(String text) {

if (logger.isDebugEnabled()) {

logger.debug("sayHi(String) - start"); //$NON-NLS-1$

}

String returnString = "Hello,你好: " + text;

if (logger.isDebugEnabled()) {

logger.debug("返回内容:"+returnString);

logger.debug("sayHi(String) - end"); //$NON-NLS-1$

}

return returnString;

}

@WebMethod

public boolean userLogon(String username ,String userpasswd)

{

logger.debug("用户名是:"+username+"口令是:"+userpasswd);

if (username.equalsIgnoreCase("admin"))

{

return true;

}else{

return false;

}

}

}

java 的web service 访问客户端

[cpp] view
plaincopy

/**

*

*/

package com.alcor.jws.test;

import org.apache.cxf.interceptor.LoggingInInterceptor;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

/**

* @author 徐泽宇(roamer)

*

* 2010-7-10

*/

public class Client {

private Client() {

}

public static void main(String args[]) throws Exception {

/*第一种方法,通过配置文件来实现 begin

ApplicationContext ctx = new ClassPathXmlApplicationContext( "META-INF/WebServiceClient.xml");

HelloWorld client = (HelloWorld) ctx.getBean("client");

String result = client.sayHi("Roamer");

System.out.println(result);

boolean logonResult = client.userLogon("roamer", "passwd");

System.out.println(logonResult);

logonResult = client.userLogon("admin", "passwd");

System.out.println(logonResult);

*/

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

factory.setAddress("http://localhost:8080/SampleWebService/webservice/HelloWorld");

factory.setServiceClass(HelloWorld.class);

factory.getInInterceptors().add(new LoggingInInterceptor());

HelloWorld helloWorld = (HelloWorld) factory.create();

boolean msg = helloWorld.userLogon("admin","World");

System.out.println(msg);

}

}

2。iphone 客户端的编程

LogonViewController.h

[cpp] view
plaincopy

//

// LogonViewController.h

// IManager

//

// Created by remote roamer on 11-11-22.

// Copyright (c) 2011年 __MyCompanyName__. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface LogonViewController : UIViewController<NSXMLParserDelegate>

{

IBOutlet UITextField * userNameTextField;

IBOutlet UITextField * userPasswordTextField;

IBOutlet UIButton * userLogonButton;

IBOutlet UITextField * webServiceURL;

NSXMLParser *xmlParser;

BOOL logonResult;

NSMutableString *soapResults;

}

@property(nonatomic,retain) IBOutlet UITextField * userNameTextField;

@property(nonatomic,retain) IBOutlet UITextField * userPasswordTextField;

@property(nonatomic,retain) IBOutlet UIButton * userLogonButton;

@property(nonatomic,retain) IBOutlet UITextField * webServiceURL;

@property(nonatomic, retain) NSXMLParser *xmlParser;

@property(nonatomic,retain) NSMutableString * soapResults;

-(IBAction) logonButtonClick:(id)sender;

@end

LogonViewController.m

[cpp] view
plaincopy

//

// LogonViewController.m

// IManager

//

// Created by remote roamer on 11-11-22.

// Copyright (c) 2011年 __MyCompanyName__. All rights reserved.

//

#import "LogonViewController.h"

@implementation LogonViewController

@synthesize userNameTextField;

@synthesize userPasswordTextField;

@synthesize userLogonButton;

@synthesize webServiceURL;

@synthesize xmlParser;

@synthesize soapResults;

-(IBAction) logonButtonClick:(id)sender

{

logonResult = false;

NSString *soapMessage = [NSString stringWithFormat:

@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"

"<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>\n"

"<ns1:userLogon xmlns:ns1=\"http://localhost:8080/SampleWebService/webservice/HelloWorld/\">"

"<arg0>%@</arg0>"

"<arg1>%@</arg1>"

"</ns1:userLogon>"

"</soap:Body>\n"

"</soap:Envelope>",self.userNameTextField.text,self.userPasswordTextField.text];

NSLog(@"调用webserivce的字符串是:%@",soapMessage);

//请求发送到的路径

NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

NSURL *url = [NSURL URLWithString:@"http://localhost:8080/SampleWebService/webservice/HelloWorld/"];

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

//以下对请求信息添加属性前四句是必有的,

[urlRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

[urlRequest addValue: @"http://localhost:8080/SampleWebService/webservice/HelloWorld" forHTTPHeaderField:@"SOAPAction"];

[urlRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];

[urlRequest setHTTPMethod:@"POST"];

[urlRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

//请求

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

theConnection = nil;

}

//如果调用有错误,则出现此信息

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

NSLog(@"ERROR with theConenction");

UIAlertView * alert =

[[UIAlertView alloc]

initWithTitle:@"提示"

message:[error description]

delegate:self

cancelButtonTitle:nil

otherButtonTitles:@"OK", nil];

[alert show];

}

//调用成功,获得soap信息

-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *)responseData

{

NSString * returnSoapXML = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSLog(@"返回的soap信息是:%@",returnSoapXML);

//开始解析xml

xmlParser = [[NSXMLParser alloc] initWithData: responseData];

[xmlParser setDelegate:self];

[xmlParser setShouldResolveExternalEntities: YES];

[xmlParser parse];

if(logonResult){

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"登录成功" message:returnSoapXML delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil];

[alert show];

}

}

//如果soap的返回字符串比较多。需要实现以下这个方法,配合 didReceiveData 方法来正确的接受到所有的soap字符串

//原因是:如果soap的返回字符串比较多。didReceiveData 这个方法会多次被调用。如果把soap解析的功能直接写在didReceiveData这个方法里面。会出现错误。这个时候,就需要 和connectionDidFinishLoading 联用。实现思路是:定义一个类变量NSMutableString * returnSoapXML;用于存放返回的soap字符串。

//一旦有返回内容,获得soap信息,追加到结果字符串中

//-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *)responseData

//{

// [returnSoapXML appendString:[[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]];

//}

//最后在connectionDidFinishLoading 方法中实现,对完整的soap字符串的业务处理

//数据全部接受成功以后调用

/*

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

NSLog(@"从远程ws中调用获得客户简单信息的调用成功!");

NSLog(@"返回的soap信息是:%@",returnSoapXML);

//从soap 信息中解析出CusotmerInfo对象数组,并且保存到数据库中

NSLog(@"开始保存ws返回的内容到本地数据库");

[[[SoapRtnJsonParser alloc] init] parse2CustomersInfo:[returnSoapXML dataUsingEncoding:NSUTF8StringEncoding]];

}

*/

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

NSLog(@"返回的soap内容中,return值是: %@",string);

if ([string isEqualToString:@"true"])

{

logonResult = YES;

}else{

logonResult = NO;

}

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom initialization

}

return self;

}

- (void)didReceiveMemoryWarning

{

// Releases the view if it doesn't have a superview.

[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.

}

#pragma mark - View lifecycle

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

}

- (void)viewDidUnload

{

[super viewDidUnload];

// Release any retained subviews of the main view.

// e.g. self.myOutlet = nil;

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

// Return YES for supported orientations

return (interfaceOrientation == UIInterfaceOrientationPortrait);

}

@end

相关文章 :

手把手教你做 iphone的soap应用

分享一个用Xcode4实现基于Webservice用户登录的iphone程序

其中要注意的几点。

[cpp] view
plaincopy

<ns1:userLogon xmlns:ns1=\"http://localhost:8080/SampleWebService/webservice/HelloWorld/\">"

"<arg0>%@</arg0>"

"<arg1>%@</arg1>"

"</ns1:userLogon>"

中web service 中的 userLogon方法的调用 要用ns1来引用。

传递的参数 不能和 webservice的变量名来写。而只能写成 arg0 和 arg1 这种方式。我查阅其他网上资料,都是写成<username>和<userpasswd>这种element的形式。但是在我的这个演示中,如果写成这种方式。后台会无法获得传入的变量。而用arg0 这种方式是可以传入。我不清楚是否是和
java cxf的webservice搭建环境和版本有关。

注意:如果后台的WebService是.net开发的,调用的程序略有不同:

例如 后台的ws服务链接是 :http://10.100.111.231:9000/MobileService.asmx

那么访问这个url,会返回如下内容:

这个页面提示了SOAP 1.1 和 SOAP 1.2 的调用的内容

[html] view
plaincopy

SOAP 1.1

The following is a sample SOAP 1.1 request and response. The placeholders shown need to be replaced with actual values.

POST /MobileService.asmx HTTP/1.1

Host: 10.100.111.231

Content-Type: text/xml; charset=utf-8

Content-Length: length

SOAPAction: "http://tempuri.org/Logon"

<?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>

<Logon xmlns="http://tempuri.org/">

<userName>string</userName>

<password>string</password>

</Logon>

</soap:Body>

</soap:Envelope>

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length

<?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>

<LogonResponse xmlns="http://tempuri.org/">

<LogonResult>string</LogonResult>

</LogonResponse>

</soap:Body>

</soap:Envelope>

SOAP 1.2

The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

POST /MobileService.asmx HTTP/1.1

Host: 10.100.111.231

Content-Type: application/soap+xml; charset=utf-8

Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">

<soap12:Body>

<Logon xmlns="http://tempuri.org/">

<userName>string</userName>

<password>string</password>

</Logon>

</soap12:Body>

</soap12:Envelope>

HTTP/1.1 200 OK

Content-Type: application/soap+xml; charset=utf-8

Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">

<soap12:Body>

<LogonResponse xmlns="http://tempuri.org/">

<LogonResult>string</LogonResult>

</LogonResponse>

</soap12:Body>

</soap12:Envelope>

那么,我们在objectiveC中代码应该写成

static NSString * wsURL = @"http://10.100.111.231:9000/MobileService.asmx";

NSString *soapMessage = [NSString stringWithFormat:

@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"

"<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>\n"

"<Logon xmlns=\"http://tempuri.org/\">"

"<userName>%@</userName>"

"<password>%@</password>"

"</Logon>"

"</soap:Body>\n"

"</soap:Envelope>",self.userNameTextField.text,self.userPasswordTextField.text];

NSLog(@"调用webserivce的字符串是:%@",soapMessage);

//请求发送到的路径

NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",wsURL]];

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

//以下对请求信息添加属性前四句是必有的,

[urlRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

[urlRequest addValue:@"http://tempuri.org/Logon" forHTTPHeaderField:@"SOAPAction"];

NSLog(@"SOAPAction is %@ ",@"http://tempuri.org/Logon");

[urlRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];

[urlRequest setHTTPMethod:@"POST"];

[urlRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

//请求

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

theConnection = nil;

注意红色的代码,这个http://tempurl.org/Logon 是要和 .net中的代码一致。否则无法访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: