2012-03-02 1 views
1

. Мой пользователь вводит адрес получателя (адрес улицы не по электронной почте). Мне нужно проверить его с помощью 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 * запрос = [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

ответ

1

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

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

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

+0

Я добавил новый код, не могли бы вы снова взглянуть? – random

+0

Вы не используете 'NSURLConnection' правильно. Пожалуйста, прочитайте * [Использование NSURLConnection] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE) * в * Руководство по программированию системы загрузки URL *. –

+0

Прошу прощения, я обновил все правильную реализацию. – random

1

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

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

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

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

  • License Agreement для API, который вы используете, довольно ограничительный. Например:

    User agrees to use the USPS Web site, APIs and USPS data to facilitate USPS shipping transactions only. [27 Jan 2012]

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

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

Хотя служба USPS делает работу, они Касс сертифицировать частных лиц предоставлять свои данные по лучшей стоимости (более специальность, опыт, особенности и т.д.).

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

+2

Мы на самом деле используем USPS для отправки предметов, поэтому мы в порядке с их TOS. Раньше у меня есть SmartyStreets, и это отличный сайт/приложение, но мы находимся в бюджете на обуви и нуждаемся в чем-то свободном (USPS). Спасибо за ссылку на TouchJSON, я посмотрю и посмотрю, поможет ли она! – random