gpt4 book ai didi

objective-c - AFNetworking 发布请求未通过 Sinatra 应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:55 25 4
gpt4 key购买 nike

我正在尝试使用我创建的 Sinatra API 从我的 iPhone 发布请求。目前,我所有的 Sinatra 应用程序正在做的就是打印出已发送给它的请求。这是相关代码:

post '/profile' do

puts "#{params}"
end

我的 objective-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)"}

我不明白为什么长 Blob 会通过。我 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 - text/json 东西 - 是因为我在 AFNetworking 中从 Sinatra 返回了一个 text/html。我现在已经检查了 Sinatra 正在接收的正文,我的巨大 JSON blob 就在那里。但是,“params”仍然是空的。

有人知道为什么吗?

已修复

看起来当您将 JSON 发布到 sinatra 时,您必须直接读取请求的主体。在 Sinatra 中,您可以这样做:

profile = JSON.parse(request.body.read.to_s)

那么profile就是你解析出来的对象。

最佳答案

我认为您需要改用 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

关于objective-c - AFNetworking 发布请求未通过 Sinatra 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com