Проверка адреса - PullRequest
       2

Проверка адреса

1 голос
/ 02 марта 2012

Мой пользователь вводит адрес получателя (почтовый адрес, а не адрес электронной почты). Мне нужно проверить это с USPS, чтобы я знал, что это на самом деле адрес.

Я сейчас копаюсь в их API и думаю, что понимаю, но я не совсем уверен, как это сделать с целью-c.

Так что почти все работает так:

  1. Мне нужно создать запрос XML, который содержит имя получателя, адрес и почтовый индекс.
  2. Я должен опубликовать это на их сервере
  3. Они отвечают XML-ответом

Вот пример того, как выглядит один из их построенных XML-запросов:

http://SERVERNAME/ShippingAPITest.dll?API=Verify&XML=<AddressValidateRequest% 20USERID="xxxxxxx"><Address ID="0"><Address1></Address1>
<Address2>6406 Ivy Lane</Address2><City>Greenbelt</City><State>MD</State> <Zip5></Zip5><Zip4></Zip4></Address></AddressValidateRequest>

Немного искажен, но сломан:

http://SERVERNAME/ShippingAPITest.dll?API=Verify&XML=
<AddressValidateRequest% 20USERID="xxxxxxx">
  <Address ID="0">
    <Address1></Address1>
     <Address2>6406 Ivy Lane</Address2>
     <City>Greenbelt</City>
     <State>MD</State>
     <Zip5></Zip5>
     <Zip4></Zip4>
  </Address>
</AddressValidateRequest>

Моя первая идея кажется очевидной, но, возможно, есть лучший способ сделать это. Поскольку XML-лента короткая, я должен начать конструирование, просто выполнив что-то вроде:

NSString * request = [NSString stringWithFormat: @ "......"]

Где он заполняется и форматируется в соответствии с указаниями выше.

Второй вопрос: как правильно отправить это на сервер?

Я просто создаю запрос NSURL и с URL-адресом в качестве созданной строки XML?

Вот что у меня есть, но я продолжаю понимать, что URL был создан неправильно:

- (void)verifyAddress:(Recipient*)_recipient {

    NSURL *_url = [NSURL URLWithString:@"http://testing.shippingapis.com/ShippingAPITest.dll?API=Verify&XML=<AddressValidateRequest%20USERID=\"********\"><Address ID=\"0\"><Address1></Address1><Address2>6406 Ivy Lane</Address2><City>Greenbelt</City><State>MD</State><Zip5></Zip5><Zip4></Zip4></Address></AddressValidateRequest>"];

    // Create the request.
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:_url
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    // create the connection with the request
    // and start loading the data
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        // Create the NSMutableData to hold the received data.
        // receivedData is an instance variable declared elsewhere.
        receivedData = [NSMutableData data];
        NSString* newStr = [[NSString alloc] initWithData:receivedData
                                                 encoding:NSUTF8StringEncoding];
        NSLog(@"the response '%@'", newStr);
    } else {
        // Inform the user that the connection failed.
        NSLog(@"error");
    }

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // This method is called when the server has determined that it
    // has enough information to create the NSURLResponse.

    // It can be called multiple times, for example in the case of a
    // redirect, so each time we reset the data.

    // receivedData is an instance variable declared elsewhere.
    [receivedData setLength:0];
}

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


    // Append the new data to receivedData.
    // receivedData is an instance variable declared elsewhere.
    [receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{

    // inform the user
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString* newStr = [[NSString alloc] initWithData:receivedData
                                             encoding:NSUTF8StringEncoding];
    NSLog(@"the response '%@'", newStr);
    // do something with the data
    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
}

Я получаю следующую ошибку:

Connection failed! Error - bad URL (null)

Мой единственный вопрос сейчас, все ли я в порядке, что касается NSURLConnection? Я могу поиграть с URL, я просто хочу убедиться, что моя реализация в порядке, поэтому я не бегаю кругами. : P

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Кори, я работаю в индустрии проверки адресов (для SmartyStreets , где то, что вы пытаетесь сделать, это наша специальность на самом деле) и видел много подобных проблем с вашей.

Мы фактически поддерживали конечную точку XML для нашего API проверки адреса ( LiveAddress ).В прошлом году мы отказались от него и развернули новый формат JSON, потому что XML был неуклюжим в использовании и имел много проблем, когда на самом деле это просто простая задача (для вас, разработчика).

Итак, несколько вещей дляимейте в виду ... и хотя ответ Роба является программно всеобъемлющим, важно учитывать также:

  • USPS является официальным источником адресов для США, но его основной домен не предоставление API-сервиса.Я подозреваю, что, особенно в связи с недавними финансовыми проблемами, поддержка и сопровождение API со временем ослабнет.

  • Лицензионное соглашение для используемого вами API вполнеограничительный.Например:

    Пользователь соглашается использовать веб-сайт USPS, API-интерфейсы и данные USPS только для облегчения транзакций доставки USPS.[27 января 2012]

    Это означает, что если вы отправляете почту или посылки через USPS, используя их API, это нормально, но для любых других целей это не разрешено и нарушает TOS.

  • Я вижу, вы разрабатываете для iOS.Для этого есть отличная библиотека JSON для этого TouchJSON , которая, на мой взгляд, проще в использовании, чем форматы XML в Objective-C.

В то время как служба USPS работает, они CASS-сертифицируют частные организации для предоставления своих данных по более выгодной цене (больше специальностей, опыта, функций и т. Д.).

Эти и другие недуги могут быть исправлены службой изсторонний поставщик.Более подробная информация и причины задокументированы здесь .Какой провайдер вы выберете, зависит от вас, но я буду рад лично ответить на любые другие вопросы, связанные с проверкой адреса.

1 голос
/ 02 марта 2012

У вас есть % 20 в вашем URL.Это должно быть %20 (без пробела).

Могут быть и другие проблемы, но это было легко обнаружить.Если вы получаете сообщение об ошибке, вам нужно отредактировать свой вопрос и вставить в сообщение об ошибке точный .

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

...