【问题标题】:Post data to WCF service in iPhone application?在 iPhone 应用程序中将数据发布到 WCF 服务?
【发布时间】:2013-03-05 20:33:49
【问题描述】:

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

【问题讨论】:

    标签: ios json web-services post


    【解决方案1】:

    你可以这样做:

    • 在您的 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...
      }
      

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

    App linkWCF service link
    它还具有用于上传图像的会话处理和二进制流(非常基本)

    【讨论】:

      【解决方案2】:

      感谢 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" %>
      

      希望这对某人有帮助...

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          相关资源
          最近更新 更多