POST HTTP请求从iOS到RESTful WCF服务.net 4.0

本文关键字:服务 WCF net RESTful HTTP 请求 iOS POST | 更新日期: 2023-09-27 17:51:19

我正在尝试创建一个POST请求到运行在IIS7 . net Framework 4.0上的c#编写的WCF web服务。

web服务适用于GET请求,但我似乎无法获得POST方法的工作。一些背景资料是,在不得不切换到。net之前,我使用PHP作为服务器端。

我的请求在iOS中的代码:

NSArray *jsonKeys = [NSArray arrayWithObjects:@"zip", nil];
NSArray *jsonValues = [NSArray arrayWithObjects: zipcode, nil];
NSDictionary *jsonDict = [NSDictionary dictionaryWithObjects:jsonValues forKeys:jsonKeys];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/weather", ConnectionString3]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:jsonData];
WCF Web服务的c#代码:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/weather")]
List<Weather> GetWeatherMethod(string zip);

我记录了iOS端的响应,其中显示了服务器发生错误的XML响应,并检查了服务器端日志,我似乎找不到任何问题。如有任何帮助,不胜感激。

我只能从服务器找到读取的日志:

(Date and Time) (Server IP) POST /PeopleService/PeopleService.svc/weather - 80 - (local app ip) AppName/1.0+CFNetwork/609+Darwin/11.4.2 400 0 0 0

POST HTTP请求从iOS到RESTful WCF服务.net 4.0

问题是您将操作的主体样式声明为Bare,但是您发送的是希望参数接收的数据包装在参数名称中。

如果将操作声明为

[OperationContract]
[WebInvoke(Method = "POST",
           RequestFormat = WebMessageFormat.Json, 
           ResponseFormat = WebMessageFormat.Json, 
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           UriTemplate = "/weather")]
List<Weather> GetWeatherMethod(string zip);

您可以发送请求正文作为{"zip":"30309"}作为您想要的

可以通过创建一个类来解决这个问题,这样JSON就可以映射到它。

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/weather")]
List<Weather> GetWeatherMethod(ZipCodeJSON zipJson);
[DataContract]
public class ZipCodeJSON
{
    [DataMember]
    public string zip { get; set; }
}