编辑2:我不再认为字典键中的“_”和“/”是问题所在。
编辑 3:我认为 JSON 不再是问题,也不是 HTTP POST 请求。我还不知道它到底是什么。
编辑4:解决了。数据元素必须是有效的 base64,否则 couch 会拒绝它。不知道那个。还不能选择我自己的答案。
我有一本要转换为 JSON 字符串的字典。这是我的字典的设置:
- (NSDictionary*) createDictionary
{
NSMutableDictionary *room = [[NSMutableDictionary alloc] init];
[room setObject:self.roomNumber forKey:@"roomNumber"];
[room setObject:self.floor forKey:@"floor"];
[room setObject:self.comment forKey:@"comment"];
[room setObject:self.type forKey:@"type"];
[room setObject:[NSNumber numberWithInt:self.status] forKey:@"status"];
[room setObject:[[NSMutableDictionary alloc] init] forKey:@"_attachments"];
NSMutableDictionary *attachments = [room objectForKey:[NSString stringWithFormat:@"_%@", @"attachments"]];
[attachments setObject:[[NSMutableDictionary alloc] init] forKey:@"picture"];
NSMutableDictionary *picture = [attachments objectForKey:@"picture"];
[picture setObject:@"text/plain" forKey:@"content_type"];
[picture setObject:@"BASE64" forKey:@"data"];
NSLog(@"Room: %@", room);
return room;
}
问题是“_”和“/”字符。当我打印出字典时,它看起来像这样:
Room: {
"_attachments" = {
picture = {
"content_type" = "text/plain";
data = BASE64;
};
};
comment = 12;
floor = 12;
roomNumber = 12;
status = 0;
type = room;
}
不知道为什么它会在那里结束,但无论如何,这并不重要。问题是带有“_”或“/”的键最终被“-marks”包围,我接收 JSON 的 Web 端点无法读取它。有谁知道我该如何解决这个问题?我使用 couchdb 并需要 _从附件键中。
编辑:我正在使用它,我将字典传递给 NSJSONSerialization,调用函数 dataWithJSONObject:options:error:。我将从该函数获得的内容存储在 NSData 对象中,并将其设置为我发出的请求中的 http 正文。内容类型是应用程序/json。我还设置了 Content-length 等。这是发出 HTTP 请求的函数。createDictionary
是上面的函数。
// Make a JSON object from the dictionary
NSError *err;
NSData* jsonRoom = [NSJSONSerialization dataWithJSONObject:[room createDictionary]
options:NSJSONWritingPrettyPrinted
error:&err];
// Set up the http POST request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", _baseURL, @"/peters_hotell"]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonRoom length]]
forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:jsonRoom];
NSLog(@"%@", jsonRoom);
// Fire the http POST request
//[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:callback];`
现在sendRequest
调用被注释掉了,但是当我使用它时,服务器无法接受请求。
这是来自 couchdb 的回复:
Data: {
error = badmatch;
reason = false;
}
当我将附件部分从字典中删除时,沙发不会抱怨。基本上我要创建的是这个 JSON(内联附件):http ://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments