EDIT 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;
}
なぜ1行になってしまうのかわかりませんが、とにかく、それは重要ではありません. 問題は、「_」または「/」を含むキーが「-マーク」で囲まれてしまい、JSON を受信する Web エンドポイントがそれを読み取れないことです。これを解決する方法を知っている人はいますか?添付ファイルのキーから。
編集:私はそれを使用しています。関数 dataWithJSONObject:options:error: を呼び出して、辞書を NSJSONSerialization に渡します。その関数から取得したものを NSData オブジェクトに格納し、それをリクエストの http 本文として設定します。Content-Type は application/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;
}
添付ファイルの部分を辞書から外すと、couch は文句を言いません。基本的に私が作成しようとしているのは、この JSON (インライン添付ファイル) です: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments