我是IOS开发的新手,我需要使用本机方法将数据发布到服务。
我想我需要做这样的事情?
NSString *content = @"field1=42&field2=Hello";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.mywebsite.co.uk/SendEmail.svc/request"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]];
// generates an autoreleased NSURLConnection
[NSURLConnection connectionWithRequest:request delegate:self];
我是否正确行事,因为我不确定?我可以通过手动构建url或在fiddler中发布json来成功发布到服务。
答案 0 :(得分:6)
你可以这样做:
在WCF服务(类似接口或具体服务实现)中创建这样的Web服务方法:
[OperationContract]
[WebInvoke(UriTemplate = "GetJourneys", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
JourneyListResult GetJourneys(string sessionID);
Request / Reponse对象可以是任何DataContract对象(将通过.NET的DataContractJsonSerializer
序列化)
创建要在请求中使用的有效内容字典:
NSDictionary *payloadDict = [NSDictionary dictionaryWithObjectsAndKeys:self.sessionID,@"sessionID", nil];
NSString *operationName = "GetJourneys";
创建如下请求:
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
urlRequest.URL = [NSURL URLWithString:[@"http://url/of/your/Service.svc/" stringByAppendingString:operationName];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-type"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payloadDict options:0 error:NULL];
[urlRequest setHTTPBody:jsonData];
ITLog(@"Issuing request: %@ %@", self.operationName, [self payloadDict]);
发送您的请求(backgroundQueue是以前创建的NSOperationQueue。请务必调度到主队列(/ thread)以进行UI处理):
[NSURLConnection sendAsynchronousRequest:urlRequest queue:backgroundQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (!error && data.length > 0) {
NSError *jsonError = nil;
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError];
if (!jsonError && [jsonObj isKindOfClass:[NSDictionary class]]) {
// process result here
} else {
// error handling
}
} else {
// error handling
}
}];
解码/使用结果
if ([jsonObject isKindOfClass:[NSArray class]]) {
NSArray *dictarr=(NSArray*)jsonObject;
NSMutableArray *resultarr=[[NSMutableArray alloc] init];
for (NSDictionary *dict in dictarr) {
ITJourney *journey =[[ITJourney alloc]initWithDictionary:dict];
[resultarr addObject:journey];
}
// use resultarr from here...
}
您可以在我为大学创建的一个小样本项目中看到它放在一起:
App link和WCF service link
它还具有会话处理和二进制流,用于上传图像(非常基本)
答案 1 :(得分:1)
感谢Martin的那篇文章,这非常有帮助。我无法让我连接,经过多次探索,我发现我的svc不接受json内容类型。我的修复是将Factory =“System.ServiceModel.Activation.WebServiceHostFactory”属性添加到.SVC文件中,所以:
<%@ ServiceHost Language="C#" Debug="true" Service="YourService" CodeBehind="YourService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
希望这有助于某人...
答案 2 :(得分:-3)
我不知道你的本地方法是什么意思,但是如果你要做很多这样的事情,特别是如果你计划排队请求,你可能想要查看第三方库,例如AFNetworking。 / p>
那就是说,如果你能够成功发布服务,那么问题是什么?