Как преобразовать эту HTML-форму в iOS

Я пытаюсь подписаться на электронные письма для моей установки Sendy, работающей на моем сервере EC2 — документацию по API для Sendy можно найти здесь.

В моем списке Сенди предполагает, что

<form action="http://www.erwaysoftware.com/sendy/subscribe" method="POST" accept-charset="utf-8">
    <label for="name">Name</label><br/>
    <input type="text" name="name" id="name"/>
    <br/>
    <label for="email">Email</label><br/>
    <input type="text" name="email" id="email"/>
    <br/>
    <label for="App">App</label><br/>
    <input type="text" name="App" id="App"/>
    <br/>
    <input type="hidden" name="list" value="my_sendy_list_key"/>
    <input type="submit" name="submit" id="submit"/>
</form>

использоваться в HTML для подписки на список. Я могу подтвердить, что это работает — см. мой веб-сайт.

Однако мне нужно подписаться на этих людей из моего приложения — через API. Вот код, который я пробовал:

- (IBAction)submitButtonPressed:(id)sender
{
    self.data = [[NSMutableData alloc] initWithLength:0];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.erwaysoftware.com/sendy/subscribe/"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"[email protected]" forHTTPHeaderField:@"email"];
    [request setValue:@"John Bob" forHTTPHeaderField:@"name"];
    [request setValue:@"api_key" forHTTPHeaderField:@"list"];
    [request setValue:@"TRUE" forHTTPHeaderField:@"boolean"];

    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];

}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.data setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
    [self.data appendData:d];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"")
                                 message:[error localizedDescription]
                                delegate:nil
                       cancelButtonTitle:NSLocalizedString(@"OK", @"")
                       otherButtonTitles:nil] show];
}

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

    // Do anything you want with it

    NSLog(@"%@", responseText);
}

NSLog показывает:

2013-04-12 15:23:03.917 Sendy API Test[13488:c07] <!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link rel="Shortcut Icon" type="image/ico" href="http://www.erwaysoftware.com/sendy/img/favicon.png">
        <title>Subscribed</title>
    </head>
    <style type="text/css">
        body{
            background: #ffffff;
            font-family: Helvetica, Arial;
        }
        #wrapper 
        {
            background: #f2f2f2;

            width: 300px;
            height: 70px;

            margin: -140px 0 0 -150px;
            position: absolute;
            top: 50%;
            left: 50%;
            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;
        }
        p{
            text-align: center;
        }
        h2{
            font-weight: normal;
            text-align: center;
        }
        a{
            color: #000;
        }
        a:hover{
            text-decoration: none;
        }
    </style>
    <body>
        <div id="wrapper">
            <h2>Email address is invalid.</h2>
        </div>
    </body>
</html>

Из этого я понял, что Sendy считает письмо недействительным — в любом случае, письмо не зарегистрировано.


person Undo    schedule 12.04.2013    source источник


Ответы (1)


Проблема в том, что вы устанавливаете заголовки HTTP-запроса. API ожидает, что информация поступит в тело HTTP. К сожалению, класс NSMutableURLRequest не предоставляет простого способа создания тела. Этот вопрос содержит образец код, который создает тело запроса вручную.

Тем не менее, составить тело запроса самостоятельно сложно, так как правила форматирования могут быть запутанными. Лучше использовать одно из расширений с открытым исходным кодом для NSURLRequest, которое позаботится об этом за вас. Я использую AFNetworking в своем текущем проекте, хотя его настройка немного сложнее.

person dpassage    schedule 12.04.2013
comment
Это может быть немного далеко идущим, но не могли бы вы предоставить несколько примеров кода для использования AFNetworking в этой ситуации? - person Undo; 13.04.2013