-1

我对 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 来成功发布到服务。

4

3 回答 3

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。请务必分派到主队列(/线程)以进行 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...
    }
    

你可以在我为大学创建的一个小示例项目中看到它:

应用程序链接WCF 服务链接
它还具有用于上传图像的会话处理和二进制流(非常基础)

于 2013-03-05T21:41:37.897 回答
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" %>

希望这可以帮助某人...

于 2013-11-25T14:10:39.237 回答
-3

我不知道你所说的本地方法是什么意思,但如果你要做很多这样的事情,特别是如果你打算对请求进行排队,你可能想看看第三方库,比如 AFNetworking。

也就是说,如果您能够成功发布到服务,那么问题是什么?

于 2013-03-05T20:39:51.023 回答