Запрос почтового индекса Поиск веб-службы с помощью кода - PullRequest
0 голосов
/ 01 декабря 2009

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

"http://localhost/afddata.pce?Serial=xxxxxx&Password=<PASSWORD>&UserID=<UNAME>&Data=Address&Task=PropertyLookup&Fields=List&MaxQuantity=200&Lookup=BD1+3RA"

Мне нужно вызвать этот URL, возможно, с помощью HttWebRequest и получить вывод, представляющий собой строку xml (см. Пример):

<?xml version="1.0"?>
<AFDPostcodeEverywhere>
<Result>1</Result><ErrorText></ErrorText><Item value="1"><Postcode>BD1 3RA</Postcode>
<PostcodeFrom></PostcodeFrom>
<Key>BD1 3RA1001</Key>
<List>BD1 3RA     City of Bradford Metropolitan District Council, Fountain Hall, Fountain Street, BRADFORD</List>
<CountryISO>GBR</CountryISO>
</Item>
</AFDPostcodeEverywhere>

Моя проблема заключается в том, что когда я набираю URL в своем браузере, я получаю XML выше в своем браузере, но я не могу получить эту строку XML через код. МОЖЕТ ЛЮБОЙ ПОМОЧЬ МНЕ ИЗ PLZ !!! ЕГО ДЕЙСТВИТЕЛЬНО ОЧЕНЬ СРОЧНО! Из того, что я прочитал, мы должны сделать запрос на мыло, но я не знаю, как это сделать !!! Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 01 декабря 2009

Вы можете получить ответ XML из объекта HttpWebResponse (в пространстве имен System.Net, если я могу вспомнить).

Чтобы получить HttpWebResponse, вы сначала должны создать объект HttpWebRequest.

См .:

И вы можете использовать следующий код для преобразования ответа в XMLDocument, который вы можете пройти:

HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://pce.afd.co.uk/afddata.pce?...");
using (HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse())
{
       XmlDocument xmlDoc = new XmlDocument();
       xmlDoc.Load(HttpWResp.GetResponseStream());
}

РЕДАКТИРОВАТЬ (1):

По всей видимости, у рассматриваемой компании есть веб-сервис ASMX , который вы сможете использовать в своем приложении .NET для доступа к необходимым данным.

Вам понадобится пароль и серийный номер (который вы можете получить по URL).

1 голос
/ 01 декабря 2009

Лично я предпочитаю использовать метод XDocument.Load, а затем использовать LINQ-to-XML для чтения результатов. Он чище, чем другие механизмы синтаксического анализа в .NET Framework.

var xmlDoc = XDocument.Load("http://localhost/afddata.pce?Serial=xxxxxx&Password=<PASSWORD>&UserID=<UNAME>&Data=Address&Task=PropertyLookup&Fields=List&MaxQuantity=200&Lookup=BD1+3RA");

Затем вы можете использовать LINQ для анализа результатов или, альтернативно, вызвать ToString (), чтобы получить XML в виде строки.

0 голосов
/ 29 октября 2015

Очень поздний ответ на этот вопрос, но я использую RestSharp для реализации этого точного сервиса.

Веб-служба, обнаруженная Робертом У, не отвечает моим потребностям, поскольку для получения полных адресных данных требуется 2 вызова: один для получения списка совпадений и один для получения выбранного адреса.

Служба XML предоставляет формат, который включает полные адресные данные для всех результатов сопоставления.

Вот мое решение.

Вам нужен пользовательский IAuthenticator:

public class AfdAuthenticator : IAuthenticator
{
    private readonly string serial;
    private readonly string password;
    private readonly string userId;

    public AfdAuthenticator(string serial, string password, string userId)
    {
        this.serial = serial;
        this.password = password;
        this.userId = userId;
    }

    public void Authenticate(IRestClient client, IRestRequest request)
    {
        // AFD requires the authentication details to be included as query string parameters
        request.AddQueryParameter("Serial", this.serial);
        request.AddQueryParameter("Password", this.password);
        request.AddQueryParameter("UserID", this.userId);
    }
}

Вам понадобятся классы для ответа:

[XmlRoot(ElementName = "AFDPostcodeEverywhere")]
public class AfdPostcodeEverywhere
{
    [XmlElement(ElementName = "Result")]
    public int Result { get; set; }

    [XmlElement(ElementName = "ErrorText")]
    public string ErrorText { get; set; }

    [XmlElement(ElementName = "Items")]
    public List<Item> Items { get; set; }
}

[XmlRoot(ElementName = "Item")]
public class Item
{
    [XmlElement(ElementName = "AbbreviatedPostalCounty")]
    public string AbbreviatedPostalCounty { get; set; }

    [XmlElement(ElementName = "OptionalCounty")]
    public string OptionalCounty { get; set; }

    [XmlElement(ElementName = "AbbreviatedOptionalCounty")]
    public string AbbreviatedOptionalCounty { get; set; }

    [XmlElement(ElementName = "PostalCounty")]
    public string PostalCounty { get; set; }

    [XmlElement(ElementName = "TraditionalCounty")]
    public string TraditionalCounty { get; set; }

    [XmlElement(ElementName = "AdministrativeCounty")]
    public string AdministrativeCounty { get; set; }

    [XmlElement(ElementName = "Postcode")]
    public string Postcode { get; set; }

    [XmlElement(ElementName = "DPS")]
    public string Dps { get; set; }

    [XmlElement(ElementName = "PostcodeFrom")]
    public string PostcodeFrom { get; set; }

    [XmlElement(ElementName = "PostcodeType")]
    public string PostcodeType { get; set; }

    [XmlElement(ElementName = "Phone")]
    public string Phone { get; set; }

    [XmlElement(ElementName = "Key")]
    public string Key { get; set; }

    [XmlElement(ElementName = "List")]
    public string List { get; set; }

    [XmlElement(ElementName = "Locality")]
    public string Locality { get; set; }

    [XmlElement(ElementName = "Property")]
    public string Property { get; set; }

    [XmlElement(ElementName = "Street")]
    public string Street { get; set; }

    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "Organisation")]
    public string Organisation { get; set; }

    [XmlElement(ElementName = "Town")]
    public string Town { get; set; }

    [XmlAttribute(AttributeName = "value")]
    public int Value { get; set; }
}

Я сгенерировал их, вызвав службу, используя PostMan , а затем Xml2CSharp для генерации классов из XML

Тогда вы можете использовать этот код:

// Create a RestClient passing in a custom authenticator and base url
var client = new RestClient
    {
        Authenticator = new AfdAuthenticator("YOUR SERIAL", "YOUR PASSWORD", "YOUR USERID"),
        BaseUrl = new UriBuilder("http", "pce.afd.co.uk").Uri
    };

// Create a RestRequest using the AFD service endpoint and setting the Method to GET
var request = new RestRequest("afddata.pce", Method.GET);

// Add the required AFD query string parameters
request.AddQueryParameter("Data", "Address");
request.AddQueryParameter("Task", "FastFind");
request.AddQueryParameter("Fields", "Simple");
request.AddQueryParameter("Lookup", "BD1 3RA");

    // Execute the request expecting an AfdPostcodeEverywhere returned 
var response = client.Execute<AfdPostcodeEverywhere>(request);

// Check that RestSharp got a response
if (response.StatusCode != HttpStatusCode.OK)
{
    throw new Exception(response.StatusDescription);
}

// Check that RestSharp was able to process the response
if (response.ResponseStatus != ResponseStatus.Completed)
{
    throw new Exception(response.ErrorMessage, response.ErrorException);
}

var afdPostcodeEverywhere = response.Data;

// Check that AFD returned data
if (afdPostcodeEverywhere.Result < 0)
{
    throw new Exception(afdPostcodeEverywhere.ErrorText);
}

// Process the results
var addresses = afdPostcodeEverywhere.Items;

Полную информацию о параметрах «Данные», «Задача», «Поля» и «Поиск», а также все коды результатов можно найти в документации AFD API, которая включена в SDK .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...