Vì vậy, tôi đang viết một ứng dụng để lưu trữ dữ liệu mã hóa địa lý khi tôi nhập bản ghi. Tôi đã có nó làm việc tốt khi tôi sử dụng một yêu cầu unsigned, tuy nhiên tôi không thể có vẻ để tìm ra những gì là sai khi tôi cố gắng sử dụng clientid của công ty và chữ ký của tôi. Tôi luôn bị Cấm 403.Sử dụng yêu cầu mã hóa địa lý API Google Maps đã ký từ Ứng dụng dòng lệnh .NET
Dưới đây là xây dựng URL của tôi:
private const string _googleUri = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
private const string _googleClientId = "XXXXXXXX";
private const string _googleSignature = "XXXXXXXXXXXXXXXXXXXXXXXX";
//RESOLVED
private static String GetGeocodeUri(string address)
{
ASCIIEncoding encoding = new ASCIIEncoding();
string url = String.Format("{0}{1}&client={2}&sensor=false"
, _googleUri
, HttpUtility.UrlEncode(address)
, _googleClientId);
// converting key to bytes will throw an exception, need to replace '-' and '_' characters first.
string usablePrivateKey = _googleSignature.Replace("-", "+").Replace("_", "/");
byte[] privateKeyBytes = Convert.FromBase64String(usablePrivateKey);
Uri uri = new Uri(url);
byte[] encodedPathAndQueryBytes = encoding.GetBytes(uri.LocalPath + uri.Query);
// compute the hash
HMACSHA1 algorithm = new HMACSHA1(privateKeyBytes);
byte[] hash = algorithm.ComputeHash(encodedPathAndQueryBytes);
// convert the bytes to string and make url-safe by replacing '+' and '/' characters
string signature = Convert.ToBase64String(hash).Replace("+", "-").Replace("/", "_");
// Add the signature to the existing URI.
return uri.Scheme + "://" + uri.Host + uri.LocalPath + uri.Query + "&signature=" + signature;
}
Dưới đây là Chương trình:
public static AddressClass GetResponseAddress(string address)
{
AddressClass GoogleAddress = new AddressClass();
XmlDocument doc = new XmlDocument();
String myUri = GetGeocodeUri(address);
try
{
doc.Load(myUri);
XmlNode root = doc.DocumentElement;
if (root.SelectSingleNode("/GeocodeResponse/status").InnerText == "OK")
{
GoogleAddress.Latitude = Double.Parse(root.SelectSingleNode("/GeocodeResponse/result/geometry/location/lat").InnerText);
GoogleAddress.Longitude = Double.Parse(root.SelectSingleNode("/GeocodeResponse/result/geometry/location/lat").InnerText);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception <" + ex.Message + ">");
}
return GoogleAddress;
}
Bây giờ, phản ứng ban đầu của tôi để nó không làm việc là Google phải thiếu miền referer vì họ phải được đăng ký . Vì vậy, tôi đã thử nó với HttpWebRequest và thiết lập các referer đến tên miền của tôi, nhưng vẫn không có con xúc xắc.
//Not needed, Just an alternate method
public static AddressClass GetResponseAddress(string address)
{
AddressClass GoogleAddress = new AddressClass();
WebClient client = new WebClient();
XmlDocument doc = new XmlDocument();
Uri myUri = new Uri(GetGeocodeUri(address));
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(myUri);
myRequest.Referer = "http://www.myDomain.com/";
//I've even tried pretending to be Chrome
//myRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7";
try
{
doc.Load(myRequest.GetResponse().GetResponseStream());
XmlNode root = doc.DocumentElement;
if (root.SelectSingleNode("/GeocodeResponse/status").InnerText == "OK")
{
GoogleAddress.Latitude = Double.Parse(root.SelectSingleNode("/GeocodeResponse/result/geometry/location/lat").InnerText);
GoogleAddress.Longitude = Double.Parse(root.SelectSingleNode("/GeocodeResponse/result/geometry/location/lat").InnerText);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception <" + ex.Message + ">");
}
return GoogleAddress;
}
Mọi trợ giúp sẽ được đánh giá cao.
Tôi gần như chắc chắn điều này sẽ giải quyết các điều khoản dịch vụ cho api được đề cập. Lý do bạn gặp phải vấn đề là vì nó không được thiết kế để sử dụng trong một ứng dụng truyền thống chỉ như một ứng dụng web. Đừng quên không có giới hạn giao dịch trừ khi bạn thanh toán cho Google. –
Google cho phép lưu vào bộ nhớ cache trước khi báo cáo cho các tập dữ liệu lớn miễn là được thực hiện đúng cách .--- (b) Không tìm nạp trước, lưu bộ nhớ đệm hoặc lưu trữ nội dung.Bạn không được tìm nạp trước, lưu trữ hoặc lưu trữ bất kỳ Nội dung nào, ngoại trừ việc bạn có thể lưu trữ: (i) Số lượng Nội dung giới hạn nhằm cải thiện hiệu suất của việc triển khai API Maps nếu bạn tạm thời, an toàn và trong cách thức không cho phép sử dụng Nội dung bên ngoài Dịch vụ; và (ii) bất kỳ mã nhận diện hoặc khóa nội dung nào mà Tài liệu API Maps cụ thể cho phép bạn lưu trữ. – copjon
@Ramhound Ngoài ra, có giới hạn truy vấn là 2.500/ngày mà không phải trả tiền và 100.000 nếu bạn thanh toán. – copjon