google URL 缩短器 API 错误(403 禁止)[更新]

google URL shortener API error (403 forbidden) [update]

所以我正在尝试在我的应用程序中使用 Google URL 缩短器 API。这是我为进行 HTTP 调用并检索缩短的 URL.

而编写的 class
public class GoogleUrlShortnerApi
{
    //API Key from Google
    private const string key = "-----------MY_KEY-----------";

    public static string Shorten(string url)
    {
        string post = "{\"longUrl\": \"" + url + "\"}";

        string shortUrl = url;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url?key=" + key);

        try {
            request.ServicePoint.Expect100Continue = false;
            request.Method = WebRequestMethods.Http.Post;
            request.ContentLength = post.Length;
            request.ContentType = "application/json";
            request.Headers.Add("Cache-Control", "no-cache");

            using (Stream requestStream = request.GetRequestStream())
            {
                byte[] postBuffer = Encoding.ASCII.GetBytes(post);
                requestStream.Write(postBuffer, 0, postBuffer.Length);
            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader responseReader = new StreamReader(responseStream))
                    {
                        string json = responseReader.ReadToEnd();
                        shortUrl = Regex.Match(json, @"""id"": ?""(?<id>.+)""").Groups["id"].Value;
                    }
                }
            }
        } catch (WebException webEx) {
            System.Diagnostics.Debug.WriteLine (webEx.Message);

            string responseText;
            using(var reader = new StreamReader(webEx.Response.GetResponseStream()))
            {
                responseText = reader.ReadToEnd();
            }
        } catch (Exception ex) {
            System.Diagnostics.Debug.WriteLine (ex.Message);
        }
        return shortUrl;
    }
}

但我不断收到“远程服务器返回错误:(403) Forbidden.”错误。

我尝试调试并在 class 中的第 2 个 using 上放置了一个断点..

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())

它永远不会进入 using 并捕获 WebException
谁能告诉我我在这里做错了什么?

感谢您的宝贵时间。

========================= 更新 ========= ================

这是 WebExceptionresponseText 的值。我被允许每天提出 1,000,000 个请求。为什么会出现此错误?

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "ipRefererBlocked",
    "message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.",
    "extendedHelp": "https://console.developers.google.com"
   }
  ],
  "code": 403,
  "message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."
 }
}

There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.

我了解到您的 API 密钥设置为受 IP 限制,并且您的请求来自未注册使用该 API 密钥的 IP。请记住,来自模拟器的请求(很可能)与它们 运行 所在的机器具有不同的 IP,因为 Android 模拟器是一个单独的 VM。

要么找出请求的来源 IP 并使用您的 API 密钥注册它,要么(如果可能)将限制切换为 per-Referer 并在您的代码中处理它。

我想通了!!

我创建的密钥是为 Android 设备创建的,它一直给我这个错误。 所以在意识到这是 IP 问题后,我创建了一个 SERVER KEY,因为没有其他密钥有 IP 选项。我将服务器密钥放入我的应用程序中,然后 BOOM!成功了!