我正在尝试使用我制作的Sinatra API从我的iPhone发布请求。目前我所有的Sinatra应用程序正在打印出已发送给它的请求。这是代码:
post '/profile' do
puts "#{params}"
end
我的目标-c也非常简单。它只是向我的API发送一个帖子请求:
NSURL *url = [NSURL URLWithString:kBaseURLString];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:JSON, @"json", nil];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"/profile" parameters:dictionary];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"SUCCESS");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
[operation start];
当JSON(在obj-c的第3行)是一个非常短的字符串,例如@“test”时,Sinatra会像这样正确打印出来:
{"json"=>"test"}
当我使用实际的JSON配置文件数据时,这是一个非常长的JSON blob,Sinatra将其打印出来:
{"json"=>"(null)"}
我无法弄清楚为什么长斑点正在通过。我100%肯定我传递了正确的字符串,但Sinatra没有收到它。我目前的理论是Sinatra对请求有最大的字符限制,但我是Sinatra和Ruby的新手,我不知道我是如何测试它的。出了什么问题?
更新
首先,感谢Kjuly的建议。我发现我对Sinatra的字符限制错了。在obj-c中,我正在对第3行上具有JSON blob的字典进行日志记录,并且它具有json blob。但是,当我在第4行记录NSMutableURLRequest的主体时,正文是空的。当我使用我的小JSON blob时,身体就会被填满。
NSMutableURLRequest是否有字符限制?任何人都可以想到为什么它不接受我的大型字典和大型JSON blob,而不是小型字典。
谢谢!
再次更新
请求正文现在正确填充。我不得不将这一行添加到第3行:
[httpClient setParameterEncoding:AFJSONParameterEncoding];
现在我收到来自Sinatra的HTTPResponse的回复:
Error Domain=com.alamofire.networking.error Code=-1016 "Expected content type {(
"text/json",
"application/json",
"text/javascript"
)}, got text/html"
Sinatra现在只是打印
{}
而不是{“json”=>“(null)”}
仍然不确定发生了什么。
更新3
好吧,我认为来自Sinatra的HTTPResponse - 文本/ json的东西 - 是因为我在AFNetworking中从Sinatra返回了一个text / html。我现在检查了Sinatra正在接收的身体,我的巨型JSON blob就在那里。但是,“params”仍然是空的。
任何人都知道为什么?
固定IT
看起来当您将JSON发布到sinatra时,您必须直接读取请求的正文。在Sinatra,你这样做:
profile = JSON.parse(request.body.read.to_s)
然后,配置文件就是您解析的对象。
答案 0 :(得分:1)
我认为您需要使用AFJSONRequestOperation
代替,这是一个示例代码:
// Fetch Data from server
NSURL *url = [NSURL URLWithString:@"https://gowalla.com/users/mattt.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation * operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest * request, NSHTTPURLResponse * response, id JSON) {
NSLog(@"Name: %@ %@", [JSON valueForKeyPath:@"first_name"], [JSON valueForKeyPath:@"last_name"]);
}
failure:nil];
[operation start];
或者您可以访问WIKI PAGE,请参阅第4步:下载并解析JSON 。