2011-02-02 1 views
2

Существует в формате JSON вызов, который, когда я звоню через завитка, как показано ниже:
Как вызвать метод JSON в прошивкой

локон -H «Content-Type: применение/JSON» -H «Принять : применение/JSON»-d "{\" CheckIN \ ": {\" сообщение \ ": \" это тест \ "}}" http://gentle-rain-302.heroku.com/checkins.json

Я получаю этот результат:

{"checkin": {"created_at": "2011-01-29T13: 52: 49Z", "id": 3, "message": "this is test", "updated_at": " 2011-01-29T13: 52: 49Z "}}

Но когда я называю в моем iPhone App, как показано ниже:

- (void)doCheckIn:(NSString *)Str 
{ 
    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSString *finalPath = [path stringByAppendingPathComponent:@"inStore-settings.plist"]; 
    NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain]; 

    NSString *appURL = [plistDictionary objectForKey:@"apiurl"]; 
    appURL = [appURL stringByAppendingString:@"checkins.json"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:appURL]]; 
    [request setPostValue:@"{\"checkin\":{\"message\":\"test\"}}" forKey:@"message"]; 
    [request startSynchronous]; 
    NSError *error = [request error]; 
    if (!error) { 
     NSString *response = [request responseString]; 
     NSLog(response); 
    } 
} 

я получаю результат, говоря:

" Изменение, которое вы хотели, было отклонено (422) "

Любая помощь очень ценится.

+0

Что такое значение appURL в конце концов? Кроме того, вы уверены, что правильно используете метод setPostValue:? Мне кажется, это немного от меня, потому что вы хотите, чтобы все тело сообщения было '{\" checkin \ ": {\" message \ ": \" test \ "}}', и похоже, что вы можете настроить это как значение для 'message'. – raidfive

+0

@raidfive: appURL имеет «http://gentle-rain-302.heroku.com/checkins.json», и я даже попробовал: «[request setPostValue: @» Это тестовое сообщение «forKey: @» message " ];» Ничего не работает! – Ali

ответ

2

Глядя на вашу команду curl, я не думаю, что вы хотите делать http multipart post, который ASIFormDataRequest специально настроен для обработки. Вы просто хотите установить тело сообщения запроса в строку json. Попробуйте использовать обычный класс ASIHTTPRequest и добавить данные в тело сообщения с помощью метода, такого как appendPostData: или тому подобного. Это должно создать для вас соответствующий HTTP-запрос.

+0

Спасибо, это сработало! – Ali

+0

Я не испортил эту библиотеку раньше, если честно. Я просто изучал юг со своего сайта http://allseeing-i.com/ASIHTTPRequest/ – raidfive

+0

Отлично, пришлось слышать! :) – raidfive

-2

Пробовал ли устанавливать Accept и Content-Type заголовки в вашем ASIFormDataRequest экземплярах?

+0

@ Александр: Нет, я не пробовал это ... я попробую эту опцию. – Ali

+0

Не забудьте щелкнуть √ рядом с моим ответом, если это сработает для вас. –

+0

@ Александр: Это не сработало :( – Ali

1

Этот фрагмент кода работает:

- (void)doCheckIn:(NSString *)Str 
{ 
    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSString *finalPath = [path stringByAppendingPathComponent:@"inStore-settings.plist"]; 
    NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain]; 

    NSString *appURL = [plistDictionary objectForKey:@"apiurl"]; 
    appURL = [appURL stringByAppendingString:@"checkins.json"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:appURL]]; 
    [request appendPostData:[@"{\"checkin\":{\"message\":\"test by Zuzar\"}}" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request addRequestHeader:@"Content-Type" value:@"application/json"]; 
    [request addRequestHeader:@"Accept" value:@"application/json"]; 
    [request setRequestMethod:@"POST"]; 
    [request startSynchronous]; 
    NSError *error = [request error]; 
    if (!error) { 
     NSString *response = [request responseString]; 
     NSLog(@"%@", response); 
    } 

} 
+0

Я думаю, вы имеете в виду «кусок», а не «мир». –

 Смежные вопросы

  • Нет связанных вопросов^_^