Я пытаюсь опубликовать запрос с моего iPhone с Sinatra API, который я сделал. В настоящее время все, что делает мое приложение Sinatra - это распечатывает отправленный ему запрос. Вот код для этого:
post '/profile' do
puts "#{params}"
end
Моя цель -с также довольно проста. Все, что он делает, это отправляет запрос на мой 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 (в строке 3 объекта obj-c) является очень короткой строкой, такой как @ "test", Синатра выводит ее правильно, как показано ниже:
{"json"=>"test"}
Когда я использую фактические данные профиля JSON, которые являются очень длинным BLOB-объектом, Sinatra печатает их так:
{"json"=>"(null)"}
Я не могу понять, почему длинный шарик проходит. Я на 100% уверен, что передаю правильную строку, но Синатра не получает ее. Моя текущая теория заключается в том, что у Синатры максимальное количество символов для запросов, но я новичок в Синатре и Руби, и я понятия не имею, как я это проверю. Что не так?
UPDATE:
Прежде всего, спасибо Кьюли за ваши предложения. Я понял, что ошибся в пределе персонажей Синатры. В obj-c я делаю логи словаря, в котором есть блоб JSON в строке 3 и блоб json. Однако, когда я записываю тело NSMutableURLRequest в строке 4, тело пусто. Когда я использую свой крошечный шарик JSON, тело заполняется.
Имеет ли NSMutableURLRequest ограничение на количество символов? Может кто-нибудь придумать причину, по которой он не примет мой очень большой словарь с большим BLOB-объектом JSON, но не с маленьким.
Спасибо!
ОБНОВЛЕНИЕ СНОВА:
Тело запроса теперь заполняется правильно. Мне пришлось добавить эту строку в строку 3:
[httpClient setParameterEncoding:AFJSONParameterEncoding];
Теперь я получаю ответ в HTTPResponse от Синатры:
Error Domain=com.alamofire.networking.error Code=-1016 "Expected content type {(
"text/json",
"application/json",
"text/javascript"
)}, got text/html"
Синатра сейчас просто печатает
{}
Вместо {"json" => "(null)"}
Все еще не уверен, что происходит.
Обновление 3
Хорошо, я думал, что HTTPResponse от Sinatra - текст / json - потому что я возвращал текст / html из Sinatra обратно в AFNetworking. Теперь я проверил тело, которое получает Синатра, и там находится мой гигантский BLOB-объект JSON. Тем не менее, «params» все еще пуст.
Кто-нибудь знает, почему?
ИСПРАВЛЕНО
Похоже, что когда вы публикуете JSON в sinatra, вы должны читать тело запроса напрямую. В Синатре вы делаете это так:
profile = JSON.parse (request.body.read.to_s)
Тогда профиль - это ваш проанализированный объект.