Monday, March 5, 2012

Json-RPC Method from iOS to Android


I have a java webservice, with some method.



The webservice methods are in this form:




@Webservice(paramNames = {"email", "password", "stayLogged", "idClient"},
public Response startSession(String email, String password, Boolean stayLogged, String idClient) throws Exception {
boolean rC = stayLogged != null && stayLogged.booleanValue();
UserService us = new UserService();
User u = us.getUsersernamePassword(email, password);
if (u == null || u.getActive() != null && !u.getActive().booleanValue()) {
return ErrorResponse.getAccessDenied(id, logger);
}
InfoSession is = null;
String newKey = null;
while (newKey == null) {
newKey = UserService.md5(Math.random() + " " + new Date().getTime());
if (SessionManager.get(newKey) != null) {
newKey = null;
} else {
is = new InfoSession(u, rC, newKey);
if (idClient != null && idClient.toUpperCase().equals("ANDROID")) {
is.setClient("ANDROID");
}
SessionManager.add(newKey, is);
}
}
logger.log(Level.INFO, "New session started: " + newKey + " - User: " + u.getEmail());
return new Response(new InfoSessionJson(newKey, is), null, id);
}



The webservice can receive json-rpc calls, and the client-side code that can invoke the methods of the webservice, in iOS has this form:




-(void)asynchronousRPCWithMethod:(NSString *)method andParams:(NSArray *)params{

NSLog(@"REMOTE PROCEDURE CALL ON %@", method);
self.rpcMethod = method;

NSMutableString *requestString = [[NSMutableString alloc] init];

//setting method
[requestString appendFormat:@"{\"method\":\"%@\"", method];

//setting params
[requestString appendString:@", \"params\":["];

int max = [params count];
int c = 0;

for (NSString *str in params){
c++;
[requestString appendFormat:@"\"%@\"", str];
if (c==max){

}
else{
[requestString appendString:@", "];
}
}

[requestString appendFormat:@"], \"id\":1}"];

NSLog(@"Request:\n%@", requestString);

NSData *requestData = [NSData dataWithBytes:[requestString UTF8String] length:[requestString length]];

[requestString release];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:WEBSITELINK]] autorelease];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:requestData];

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[conn start];

UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;

if (conn) {
NSMutableData *data = [[NSMutableData alloc] init];
self.receivedData = data;
[data release];
}
else {
NSError *error = [NSError errorWithDomain:RPCErrorDomain
code:RPCErrorNoConnection
userInfo:nil];
NSLog(@"*** error ***\n%@", error);
/**
* SENT A MESSAGE WITH A ERROR
*/
if ([self.delegate respondsToSelector:@selector(rpcDidFailWithError:)])
[delegate rpcDidFailWithError:error];

}

}



How can I implement the same client side method on Android???

No comments:

Post a Comment