Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.68
MaZaHaKa91
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 8
#1

Отправка POST запроса на сервер - Objective-C

17.11.2013, 09:02. Просмотров 5176. Ответов 14
Метки нет (Все метки)

Так как,в прошлой теме мне никто отвечать даже и не собирается,то спрошу у добрых и умных людей в другйо формулировке?Как отправить в XCode POST запрос с верными параметрами(логин,пароль)?И как определить на какую именоо страничку на сервере нужно посылать этот запрос?Сайт www.dnevnik.ru
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.11.2013, 10:18     Отправка POST запроса на сервер #2
делаю так:

при нажатии на кнопку отправки\логига
Код
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL
URLWithString:@"http://сайт.ru/login.php"]
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
request.HTTPMethod = @"POST";

NSString * myName = edit_name.text;
NSString * myPassword= edit_password.text;

NSString * param = [NSString stringWithFormat:@"action=login&name=%@&password=%@", myName, myPassword];
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];


if (connection) {
// сообщение пользователю - пожалуйста, подождите ...
receivedData = [[NSMutableData data] init];
}
далее обрабатываю ответ

Код
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

[receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
UIAlertView *errorAlert = [[UIAlertView alloc]
initWithTitle:@"Ошибка" message:@"Пожалуйста, проверьте соединение с Интернетом." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
NSString * data = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

if ([data  isEqual: @"OK"]) {

label_status.text = @"Вы успешно залогинены.";
}

}
MaZaHaKa91
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 8
19.11.2013, 15:32  [ТС]     Отправка POST запроса на сервер #3
albert102,большое спасибо за ответ.Этот код более менее завелся,но у меня есть парочка вопросов

1)Почему мне XCode перед каждой переменной предлагает поставить черту _ ? Понять не могу что он хочет .Он пишет "Use of undeclared identifer".Переменную я обьявил,а он будто не видит
2)Ты написал в коде что запрос посылается на php страницу на сервере,как мне понять на какой адрес посылать эти данные? Сайт www.dnevnik.ru .Может как-то можно в HTML коде страницы это увидеть?
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
19.11.2013, 19:30     Отправка POST запроса на сервер #4
Цитата Сообщение от MaZaHaKa91 Посмотреть сообщение
1)Почему мне XCode перед каждой переменной предлагает поставить черту _ ? Понять не могу что он хочет .Он пишет "Use of undeclared identifer".Переменную я обьявил,а он будто не видит
Вы скорее всего объявили не переменную, а @property, xcode для @property автоматом создает ivar, называя его _имяпроперти, и соответствующие аксессоры (емнип так с версии 4)
2)Ты написал в коде что запрос посылается на php страницу на сервере,как мне понять на какой адрес посылать эти данные? Сайт www.dnevnik.ru .Может как-то можно в HTML коде страницы это увидеть?
HTML5
1
<form id="loginForm" action="https://login.dnevnik.ru" method="post" class="form">
MaZaHaKa91
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 8
20.11.2013, 17:26  [ТС]     Отправка POST запроса на сервер #5
albert102,вылетает после запуска(скрин и код ниже):
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#import "DNVViewController.h"
 
@interface DNVViewController ()
 
 
@end
 
@implementation DNVViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
  
 
       
        
 
//- (IBAction)comeButtonAction:(id)sender
//{
 
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL
                                                                    URLWithString:@"http://login.dnevnik.ru"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
request.HTTPMethod = @"POST";
 
NSString * myName = _edit_name.text;
NSString * myPassword= _edit_password.text;
 
NSString * param = [NSString stringWithFormat:@"action=login&name=%@&password=%@", myName, myPassword];
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
 
 
if (connection) {
    _otvet.text = @"Соединение установлено";
    NSLog(@"ama ama");
    receivedData = [[NSMutableData data] init];
}
else
{
    _otvet.text=@"Проблема с соединением";
    NSLog(@"ama ama faza");
}
    
}
 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        [[receivedData init] setLength:999999];
        
    }
    
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        
        [receivedData appendData:data];
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Ошибка" message:@"Пожалуйста, проверьте соединение с Интернетом." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }
    
    
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        
        NSString * data = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
        
        if ([data  isEqual: @"OK"]) {
            
            _otvet.text = @"Вы успешно залогинены.";
            NSLog(@"Вы успешно залогинены.");
        }
    }
 
 
 
 
 
    @end
http://www.picshare.ru/uploads/131120/osBCoFt4k9.jpg
Монфрид
1194 / 1004 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
20.11.2013, 23:19     Отправка POST запроса на сервер #6
вам бы элементарно книжек для начала почитать по тематике программирования на objc, а то вы своими "вылетает после запуска" замучаете всех
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
21.11.2013, 08:27     Отправка POST запроса на сервер #7
MaZaHaKa91, это надо было такой бесполезный скриншот снять... Аплодирую стоя

Добавлено через 8 минут
Падает либо на didReceiveResponse либо на didReceiveData... Не ясно из скриншота. Но делаете вы еще ту "магию"...
Не делайте так.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
21.11.2013, 09:34     Отправка POST запроса на сервер #8
Цитата Сообщение от MaZaHaKa91 Посмотреть сообщение
[[receivedData init] setLength:999999];
это прелестно

Поддерживаю Монфрид
albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
21.11.2013, 09:49     Отправка POST запроса на сервер #9
вместо
Код
[[receivedData init] setLength:999999];
надо же
Код
[receivedData setLength:0];

а что бы редактор понял что такое receivedData наверху
Код
@interface DNVViewController (){
NSMutableData * receivedData;
}
надо добавить

кстати вопрос, читал что после alloc надо всегда делать release, чтобы утечки памяти не было.
почему в xcode 5 при добавлении например
Код
[errorAlert show];
[errorAlert release];
вылетает ошибка? типо xcode 5 сам понимает?
Dark_Knight12
41 / 41 / 2
Регистрация: 07.11.2013
Сообщений: 132
21.11.2013, 11:32     Отправка POST запроса на сервер #10
Цитата Сообщение от albert102 Посмотреть сообщение
вылетает ошибка? типо xcode 5 сам понимает?
Да, в Xcode 5 организована система ARC. ARC не только управляет памятью вместо вас, но и запрещает вам делать это собственноручно. Совершенно недопустимо, используя ARC, посылать сообщения retain/release/autorelease объектам.
MaZaHaKa91
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 8
21.11.2013, 15:56  [ТС]     Отправка POST запроса на сервер #11
albert102,спасибо,я указал такой параметр для метода setLength ,т.к программа крашилась из за этого параметра,и на стеке было такое решение(оказалось необходимо было правильно работать с массивом данных получаемых из сети.Теперь программа не крашится,т.к я пересоздал проект уже с функцией ARC ,потому что из за косяков с памятью программа и чудила.Теперь все нормально.Осталась одна проблема.Я привязал код на кнопку и Text Field (для того чтобы можно было вводить логин и пароль),но осталась одна проблема при исполнении данного кусочка кода,программа говорит что не авторизовалась:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#import "MainClass.h"
 
@implementation MainClass
 
- (IBAction)actionButton:(id)sender {
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL
                                                                        URLWithString:@"http://login.dnevnik.ru"]
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
    request.HTTPMethod = @"POST";
    
    NSString * myName = _loginLogin.text;
    NSString * myPassword= _passwordLogin.text;
    
    NSString * param = [NSString stringWithFormat:@"action=login&name=%@&password=%@", myName, myPassword];
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    
    
    if (connection) {
        _otvet.text = @"Соединение установлено";
        NSLog(@"ama ama");
        
    }
    else
    {
        _otvet.text=@"Проблема с соединением";
        NSLog(@"ama ama faza");
    }
    
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];
    
}
 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    
    [receivedData appendData:data];
}
 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Ошибка" message:@"Пожалуйста, проверьте соединение с Интернетом." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}
 
 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
    NSString * data = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    
    if ([data  isEqual: @"OK"]) {
        
        _otvet.text = @"Вы успешно залогинены.";
        NSLog(@"Вы успешно залогинены.");
    }
    else
    {
        NSLog(@"Ошибка авторизации");
  }
}
 
 
- (IBAction)passwordLogin:(id)sender {
}
 
- (IBAction)loginLogin:(id)sender {
}
@end
Подозреваю ,что ошибка в этом отрывке кода :
Objective-C
1
2
3
4
5
NSString * myName = _loginLogin.text;
    NSString * myPassword= _passwordLogin.text;
    
    NSString * param = [NSString stringWithFormat:@"action=login&name=%@&password=%@", myName, myPassword];
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
Обьясните пожалуйста,как необходимо формировать параметр для отправки данных?Литературы для работы в Objective C,с HTML в интернете я не нашел.Осилил уже два учебника,а нигде такой темы и не встречается.И кстати массив receivedData у меня был описан как переменная в h файле,так что с этим все нормально.
albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
21.11.2013, 16:01     Отправка POST запроса на сервер #12
зачем тут то все верно,.
авторизации нет, потому что надо на стороне сайта смотреть php файл, что он там обрабатывает и как.
я просто пример привел как передать в него
Код
action=login&name=%@&password=%@
MaZaHaKa91
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 8
21.11.2013, 16:22  [ТС]     Отправка POST запроса на сервер #13
Цитата Сообщение от albert102 Посмотреть сообщение
зачем тут то все верно,.
авторизации нет, потому что надо на стороне сайта смотреть php файл, что он там обрабатывает и как.
я просто пример привел как передать в него
Код
action=login&name=%@&password=%@
воот,а вот как его найти,и что потом с ним делать,я и не знаю((совсем замучался уже

Добавлено через 6 минут
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<form id="formLogin" action="/" method="post" class="formLogin">
    <input type="hidden" name="xss" value="7e90ae165d678d17966fc4e74e2e7029fd9e8895c8739a8d6d8e91a5a31e310e" />
    <input id="ReturnUrl" name="ReturnUrl" type="hidden" value="" />
 
    <h2>Вход в Дневник</h2>
 
    <div class="col24 first">
        <div class="panel">
            <div class="rounded">
                <div class="c1">
                    <div class="c2"></div>
                </div>
                <div class="cc">
                    <div class="row">
                        <label for="Login">Логин</label>
                        <input class="t w2 r required" id="Login" name="Login" tabindex="1" type="text" value="" />
                        <div class="clear"></div>
                    </div>
                    <div class="row">
                        <label for="Password" class="f">Пароль <a href="/password" title="Восстановление забытого пароля">Забыли пароль?</a></label>
                        <input type="password" id="Password" name="Password" value="" maxlength="50" class="t w2 r required" tabindex="2" />
                        <div class="clear"></div>
Вот,откопал кусок странички,который подозрительно похож на то что мне нужно

Добавлено через 11 минут
но ,а с ним то,что делать?
Монфрид
1194 / 1004 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
21.11.2013, 19:05     Отправка POST запроса на сервер #14
есть такая штука как sniffer (или анализатор траффика) (Http Analizer, например), вот его запускаете, указываете, за каким процессом следить (ie, например), в ie открываете эту страничку свою, делаете логин, и проч. После чего сниффер покажет все запросы, заголовки, и данные которые отсылаются этим процессом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2015, 01:37     Отправка POST запроса на сервер
Еще ссылки по теме:

Передача данных с клиента на сервер и обратно Objective-C
Программа клиент сервер Objective-C
Objective-C Открытие второго контроллера после удачного POST запроса
Objective-C Добавление кода отправки GET запроса в AppDelegate.m
PHP Отправка POST запроса на сервер

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sp1derok
1 / 1 / 0
Регистрация: 04.02.2015
Сообщений: 18
13.03.2015, 01:37     Отправка POST запроса на сервер #15
Цитата Сообщение от MaZaHaKa91 Посмотреть сообщение
воот,а вот как его найти,и что потом с ним делать,я и не знаю((совсем замучался уже
Я думаю что уже не в тему, но я как раз разбирался с тем же самым и мне очень помогла программа Charles web proxy, там как раз и можно посмотреть что конкретно отправляется.
В Вашем случаи я думаю :

Objective-C
1
NSString * param = [NSString stringWithFormat:@"Login=%@&Password=%@", myLogin, myPassword];
Для моей программы я взял именно этот запрос и подставил данные по поему сайту, все работает.
Yandex
Объявления
13.03.2015, 01:37     Отправка POST запроса на сервер
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru