forked from BAPostma/PostcodeAPI.Net
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPostcodeApiClient.cs
More file actions
178 lines (147 loc) · 6.96 KB
/
Copy pathPostcodeApiClient.cs
File metadata and controls
178 lines (147 loc) · 6.96 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using Newtonsoft.Json;
using PostcodeAPI.V2.Model;
using PostcodeAPI.V2.Wrappers;
using RestSharp;
namespace PostcodeAPI.V2
{
public sealed class PostcodeApiClient : PostcodeApiClientBase
{
private const string ResourceAddresses = "addresses";
private const string ResourcePostcodes = "postcodes";
/// <summary>
/// The number of calls that the client is allowed to make per day
/// Value is null when no call has been made yet.
/// </summary>
public int? RequestDayLimit { get; private set; } = null;
/// <summary>
/// The remaining number of calls that the client is still allowed to make this day.
/// Value is null when no call has been made yet.
/// </summary>
public int? RequestsRemaining { get; private set; } = null;
public PostcodeApiClient(string apiKey) : base(apiKey, Constants.APIBaseUrls.V2, Constants.APIHeaderKeys.AuthKeyV2)
{
InitialiseClient();
}
public PostcodeApiClient(string apiKey, IRestClient restClient) : base(apiKey, Constants.APIBaseUrls.V1, Constants.APIHeaderKeys.AuthKeyV2)
{
InitialiseClient(restClient);
}
public ApiHalResultWrapper GetAddress(string postcode)
{
if (FindPostcodeType(postcode) != Constants.PostcodeFormatTypes.P6)
{
throw new ArgumentException("Postcode is not of the correct format " + Constants.PostcodeFormatTypes.P6);
}
return GetAddress(null, postcode, null);
}
public ApiHalResultWrapper GetAddress(string postcode, int number)
{
return GetAddress(null, postcode, number);
}
public ApiHalResultWrapper GetAddress(string from, string postcode, int? number)
{
RestRequest request = new RestRequest(ResourceAddresses, Method.GET);
if (from != null)
{
request.AddParameter("from", from);
}
if (postcode != null)
{
postcode = postcode.Replace(" ", string.Empty);
request.AddParameter("postcode", postcode);
}
if (number != null)
{
request.AddParameter("number", number);
}
IRestResponse<ApiHalResultWrapper> result = Client.Execute<ApiHalResultWrapper>(request);
if (result.StatusCode != HttpStatusCode.OK) HandleStatusCodeResult(result);
UpdateLimitsAfterApiCall(result);
var instance = JsonConvert.DeserializeObject<ApiHalResultWrapper>(result.Content);
return instance;
}
/// <summary>
/// Gets information about a single address.
/// </summary>
/// <param name="id">Identifier of the address. Equal to that of the governmental standard BAG.</param>
/// <example>0268200000075156</example>
public Address GetAddressInfo(string id)
{
RestRequest request = new RestRequest(ResourceAddresses + "/{id}", Method.GET);
request.AddUrlSegment("id", id);
IRestResponse<Address> result = Client.Execute<Address>(request);
if (result.StatusCode != HttpStatusCode.OK) HandleStatusCodeResult(result);
UpdateLimitsAfterApiCall(result);
var instance = JsonConvert.DeserializeObject<Address>(result.Content);
return instance;
}
/// <summary>
/// Gets all postcodes in The Netherlands, paginated per 20 records.
/// </summary>
/// <param name="postcodeArea">Filter on post code area in P4 format (the numbers of a postcode only)</param>
/// <param name="from">Meant for pagination. Use the HAL links for the correct value</param>
public ApiHalResultWrapper GetPostcodes(string postcodeArea = null, string from = null)
{
RestRequest request = new RestRequest(ResourcePostcodes, Method.GET);
if (postcodeArea != null)
{
if (FindPostcodeType(postcodeArea) != Constants.PostcodeFormatTypes.P4)
{
throw new ArgumentException("Postcode is not of the correct format " + Constants.PostcodeFormatTypes.P4);
}
request.AddParameter("postcodeArea", postcodeArea);
}
if (from != null)
{
request.AddParameter("from", from);
}
IRestResponse<ApiHalResultWrapper> result = Client.Execute<ApiHalResultWrapper>(request);
if (result.StatusCode != HttpStatusCode.OK) HandleStatusCodeResult(result);
UpdateLimitsAfterApiCall(result);
var instance = JsonConvert.DeserializeObject<ApiHalResultWrapper>(result.Content);
return instance;
}
/// <summary>
/// Gets information about a single postcode.
/// </summary>
/// <param name="postcode">The postcode in P6 format (<seealso cref="Constants.PostcodeFormatTypes.P6" />)</param>
public PostcodeArea GetPostcode(string postcode)
{
RestRequest request = new RestRequest(ResourcePostcodes + "/{postcode}", Method.GET);
request.AddUrlSegment("postcode", postcode);
if (FindPostcodeType(postcode) != Constants.PostcodeFormatTypes.P6)
{
throw new ArgumentException("Postcode is not of the correct format " + Constants.PostcodeFormatTypes.P6, nameof(postcode));
}
IRestResponse<PostcodeArea> result = Client.Execute<PostcodeArea>(request);
if (result.StatusCode != HttpStatusCode.OK) HandleStatusCodeResult(result);
UpdateLimitsAfterApiCall(result);
var instance = JsonConvert.DeserializeObject<PostcodeArea>(result.Content);
return instance;
}
private void HandleStatusCodeResult(IRestResponse restResponse)
{
dynamic result = JsonConvert.DeserializeObject(restResponse.Content);
string error = result.error ?? restResponse.Content;
throw new HttpRequestException(error, restResponse.ErrorException);
}
private void UpdateLimitsAfterApiCall(IRestResponse restResponse)
{
int limitValue, remainingValue;
Parameter limit = restResponse.Headers.FirstOrDefault(h => h.Name == "X-RateLimit-Limit" && h.Type == ParameterType.HttpHeader);
Parameter remaining = restResponse.Headers.FirstOrDefault(h => h.Name == "X-RateLimit-Remaining" && h.Type == ParameterType.HttpHeader);
if (limit != null && int.TryParse(limit.Value.ToString(), out limitValue))
{
RequestDayLimit = limitValue;
}
if (remaining != null && int.TryParse(remaining.Value.ToString(), out remainingValue))
{
RequestsRemaining = remainingValue;
}
}
}
}