AFNetworking почтовый запрос не доходит до приложения Sinatra - PullRequest
2 голосов
/ 20 февраля 2012

Я пытаюсь опубликовать запрос с моего 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)

Тогда профиль - это ваш проанализированный объект.

1 Ответ

1 голос
/ 20 февраля 2012

Я думаю, что вам нужно использовать 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 .

...