0

我正在尝试将数据发布到 JSON 网络服务。如果我这样做,我可以成功:

curl -d "project[name]=hi&project[description]=yes" http://mypath.com/projects.json

我正在尝试使用这样的代码来完成它:

 NSError *error = nil;
 NSDictionary *newProject = [NSDictionary dictionaryWithObjectsAndKeys:self.nameField.text, @"name", self.descField.text, @"description", nil];
 NSLog(@"%@", self.descField.text);
 NSData *newData = [NSJSONSerialization dataWithJSONObject:newProject options:kNilOptions error:&error];
 NSMutableURLRequest *url = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://mypath.com/projects.json"]];
 [url setHTTPBody:newData];
 [url setHTTPMethod:@"POST"];
 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:url delegate:self];

我的请求创建了一个新条目,但该条目的名称和描述均为空白。上面代码中的我的 NSLog 会产生适当的输出。

4

1 回答 1

2

你在这里混淆了两件事。Web 服务返回 JSON 结果http://mypath.com/projects.json,但在您的 curl 示例中,您的 HTTP 正文是一个普通的旧查询字符串表单正文。要完成这项工作,您需要执行以下操作:

NSError *error = nil;
NSString * newProject = [NSString stringWithFormat:@"project[name]=%@&project[description]=%@", self.nameField.text, self.descField.text];
NSData *newData = [newProject dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; // read docs on dataUsingEncoding to make sure you want to allow lossy conversion
NSMutableURLRequest *url = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://mypath.com/projects.json"]];
[url setHTTPBody:newData];
[url setHTTPMethod:@"POST"];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:url delegate:self];

这将等同于您在上面所做的 curl 调用。或者,如果您想使用 curl 发布 JSON(就像您的 ObjC 代码示例所做的那样),您可以这样做:

curl -d '"{\"project\":{\"name\":\"hi\",\"project\":\"yes\"}}"' -H "Content-Type: application/json" http://mypath.com/projects.json

于 2012-04-20T22:24:17.537 回答