#iphone #asihttprequest
#iPhone #asihttprequest
Вопрос:
Я работаю над приложением для iPhone, и мои требования заключаются в том, чтобы сделать простое сообщение для веб-службы, а веб-служба возвращает ответ json.
Пример кода, который они дают для сообщения, таков, но как мне получить ответ? Я вижу, что есть асинхронный код для выполнения get, но как мне сделать это асинхронно для post?
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addPostValue:@"Ben" forKey:@"names"];
[request addPostValue:@"George" forKey:@"names"];
Ответ №1:
Если вы ориентируетесь на iOS 4 , вы можете использовать блоки, что делает асинхронный код немного приятнее. Вам не придется иметь дело с делегатами.
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addPostValue:@"Ben" forKey:@"names"];
[request addPostValue:@"George" forKey:@"names"];
[request setCompletionBlock:^{
NSLog(@"%@", request.responseString);
}];
[request setFailedBlock:^{
NSLog(@"%@", request.error);
}];
[request startAsynchronous];
Подробнее о блоках
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Ответ №2:
Это используется для публикации синхронного ответа, ответ будет в переменной «ответ».
- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}
Чтобы выполнить асинхронный запрос, выполните следующие действия:
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
В основном завершенный запрос будет вызываться при наличии данных, в зависимости от формата вы можете получить либо NSData, либо NSString, как в примере.
Ваши параметры, которые вы можете ввести, как вы сами сказали:
[request addPostValue:@"Ben" forKey:@"names"];
[request addPostValue:@"George" forKey:@"names"];
Я использовал обычный тип запроса, вы могли бы заменить класс ASIHTTPRequest на ASIFormDataRequest .