Как использовать ASI Http в iOS для отправки данных в веб-службу? - PullRequest
5 голосов
/ 01 сентября 2011

Я использую инструкции, представленные на странице ASI здесь . Я пытаюсь отправить некоторые данные в веб-сервис и не вижу результатов.

Это мой sendRequest метод, который вызывается в viewDidLoad

-(void)sendRequest {
    NSURL *url = [NSURL URLWithString:@"http://153.60.6.75:8080/BarcodePayment/transactions"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request addRequestHeader:@"Accept" value:@"application/json"];
    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    NSString *dataContent = @"{\"id\":7,\"amount\":7.0,\"paid\":true}";
    NSLog(@"dataContent: %@", dataContent);
    [request appendPostData:[dataContent dataUsingEncoding:NSUTF8StringEncoding]];
    [request setRequestMethod:@"POST"];
}

Я проверяю строку dataContent и вывод

{"id":7,"amount":7.0,"paid":true}

Если я использую curl из терминала, я проверил, и эта команда работает.

curl -X POST -H 'Accept:application/json' -H 'Content-Type: application/json' http://153.60.6.75:8080/BarcodePayment/transactions/ --data '{"id":7,"amount":7.0,"paid":true}'

Насколько я понимаю, при использовании curl я устанавливаю json, указываю адрес, указываю данные, которые эквивалентны dataContent в моем коде. Ничего не произошло. Что не так?

Спасибо за помощь!

Ответы [ 6 ]

3 голосов
/ 01 сентября 2011

У вас есть почти все, кроме самого важного компонента, который должен запустить запрос

Вам необходимо добавить [request startSynchronous]; для синхронного запроса или [requester startAsynchronous]; для асинхронного запроса (и вам, возможно, понадобитсяДелегировать методы для обработки любого вашего ответа)

Все это довольно хорошо описано в ASIHTTPRequest Руководстве по использованию .Наиболее релевантными для этого разделами будут «Создание синхронного запроса» и «Создание асинхронного запроса».Также стоит подумать о том, что взято с этой страницы:

В общем, вы должны использовать асинхронные запросы, а не синхронные.Когда вы используете ASIHTTPRequest синхронно из основного потока, пользовательский интерфейс вашего приложения блокируется и становится недоступным на время запроса.

2 голосов
/ 01 сентября 2011

Вы забыли позвонить:

[request setDelegate: self];
[request startAsynchronous];

Или:

[request startSynchronous];

Если вы не позвоните ни одному из них, запрос никогда не будет выполнен:)

1 голос
/ 01 сентября 2011

Вы на самом деле не отправляете запрос.

1) Вам нужно вызвать [request startSynchronous] или [request startAsynchronous]

2) Если вы используете асинхронный (что вам, вероятно, следует сделать), вам нужно установить делегат и реализовать - (void) requestFinished: (ASIHTTPRequest *) метод запроса.

1 голос
/ 01 сентября 2011

Похоже, вы не звонили [request startAsynchronous];

Проверьте Документация ASIHTTPRequest для более подробной информации о том, как использовать

1 голос
/ 01 сентября 2011

Я не вижу звонка на [request startSynchronous] (или [request startAsynchronous]) в вашем коде ... Вы вообще нигде не инициируете запрос?

0 голосов
/ 24 марта 2014
- (void)postThresholdDetails:(NSDictionary *)info

{ NSString * urlString = [NSString stringWithFormat: @ "% @% @ /", BaseUrl, PostThresholdDetails]; NSURL * url = [NSURL URLWithString: urlString];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request setDelegate:self];
[request setTimeOutSeconds:120];
[request addRequestHeader:@"Accept" value:@"application/json"];
[request addRequestHeader:@"content-type" value:@"application/x-www-form-urlencoded"];
request.allowCompressedResponse = NO;
request.useCookiePersistence = NO;
request.shouldCompressRequestBody = NO;
[request setPostBody:[NSMutableData dataWithData: [info objectForKey:@"jsondata"] ]];
[request startAsynchronous];

}

...