AFNetworking发布请求没有通过Sinatra应用程序

时间:2012-02-20 04:41:38

标签: objective-c ruby sinatra afnetworking

我正在尝试使用我制作的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)

然后,配置文件就是您解析的对象。

1 个答案:

答案 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