在 C# 中调用 google Url Shortner API

发布于 2024-12-14 11:41:47 字数 1444 浏览 1 评论 0原文

我想从我的 C# 控制台应用程序调用 google 网址缩短 API ,我尝试实现的请求是:

发布https://www.googleapis.com/urlshortener/v1/url

内容类型:application/json

{"longUrl": "http://www.google.com/"}

当我尝试使用这个时代码:

using System.Net;
using System.Net.Http;
using System.IO;

主要方法是:

static void Main(string[] args)
{
    string s = "http://www.google.com/";
    var client = new HttpClient();

    // Create the HttpContent for the form to be posted.
    var requestContent = new FormUrlEncodedContent(new[] {new KeyValuePair<string, string>("longUrl", s),});

    // Get the response.            
    HttpResponseMessage response = client.Post("https://www.googleapis.com/urlshortener/v1/url",requestContent);

    // Get the response content.
    HttpContent responseContent = response.Content;

    // Get the stream of the content.
    using (var reader = new StreamReader(responseContent.ContentReadStream))
    {
        // Write the output.
        s = reader.ReadToEnd();
        Console.WriteLine(s);
    }
    Console.Read();
}

我收到错误代码400:此API不支持解析表单编码输入。 我不知道如何解决这个问题。

I want to call the google url shortner API from my C# Console Application, the request I try to implement is:

POST https://www.googleapis.com/urlshortener/v1/url

Content-Type: application/json

{"longUrl": "http://www.google.com/"}

When I try to use this code:

using System.Net;
using System.Net.Http;
using System.IO;

and the main method is:

static void Main(string[] args)
{
    string s = "http://www.google.com/";
    var client = new HttpClient();

    // Create the HttpContent for the form to be posted.
    var requestContent = new FormUrlEncodedContent(new[] {new KeyValuePair<string, string>("longUrl", s),});

    // Get the response.            
    HttpResponseMessage response = client.Post("https://www.googleapis.com/urlshortener/v1/url",requestContent);

    // Get the response content.
    HttpContent responseContent = response.Content;

    // Get the stream of the content.
    using (var reader = new StreamReader(responseContent.ContentReadStream))
    {
        // Write the output.
        s = reader.ReadToEnd();
        Console.WriteLine(s);
    }
    Console.Read();
}

I get the error code 400: This API does not support parsing form-encoded input.
I don't know how to fix this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

猫卆 2024-12-21 11:41:47

你可以检查下面的代码(使用System.Net)。
您应该注意到,必须指定 contenttype,并且必须是“application/json”;并且要发送的字符串必须是 json 格式。

using System;
using System.Net;

using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url");
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = "{\"longUrl\":\"http://www.google.com/\"}";
                Console.WriteLine(json);
                streamWriter.Write(json);
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                Console.WriteLine(responseText);
            }

        }

    }
}

you can check the code below (made use of System.Net).
You should notice that the contenttype must be specfied, and must be "application/json"; and also the string to be send must be in json format.

using System;
using System.Net;

using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url");
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = "{\"longUrl\":\"http://www.google.com/\"}";
                Console.WriteLine(json);
                streamWriter.Write(json);
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                Console.WriteLine(responseText);
            }

        }

    }
}
瑾夏年华 2024-12-21 11:41:47

Google 有一个用于使用 Urlshortener API 的 NuGet 包。您可以在此处找到详细信息。

基于此示例 您可以这样实现它:

using System;
using System.Net;
using System.Net.Http;
using Google.Apis.Services;
using Google.Apis.Urlshortener.v1;
using Google.Apis.Urlshortener.v1.Data;
using Google.Apis.Http;

namespace ConsoleTestBed
{
    class Program
    {
        private const string ApiKey = "YourAPIKey";

        static void Main(string[] args)
        {
            var initializer = new BaseClientService.Initializer
            {
                ApiKey = ApiKey,
                //HttpClientFactory = new ProxySupportedHttpClientFactory()
            };
            var service = new UrlshortenerService(initializer);
            var longUrl = "http://wwww.google.com/";
            var response = service.Url.Insert(new Url { LongUrl = longUrl }).Execute();

            Console.WriteLine($"Short URL: {response.Id}");
            Console.ReadKey();
        }
    }
}

如果您位于防火墙后面,您可能需要使用代理。下面是 ProxySupportedHttpClientFactory 的实现,在上面的示例中已被注释掉。这归功于 这篇博文

class ProxySupportedHttpClientFactory : HttpClientFactory
{
    private static readonly Uri ProxyAddress 
        = new UriBuilder("http", "YourProxyIP", 80).Uri;
    private static readonly NetworkCredential ProxyCredentials 
        = new NetworkCredential("user", "password", "domain");

    protected override HttpMessageHandler CreateHandler(CreateHttpClientArgs args)
    {
        return new WebRequestHandler
        {
            UseProxy = true,
            UseCookies = false,
            Proxy = new WebProxy(ProxyAddress, false, null, ProxyCredentials)
        };
    }
}

Google has a NuGet package for using the Urlshortener API. Details can be found here.

Based on this example you would implement it as such:

using System;
using System.Net;
using System.Net.Http;
using Google.Apis.Services;
using Google.Apis.Urlshortener.v1;
using Google.Apis.Urlshortener.v1.Data;
using Google.Apis.Http;

namespace ConsoleTestBed
{
    class Program
    {
        private const string ApiKey = "YourAPIKey";

        static void Main(string[] args)
        {
            var initializer = new BaseClientService.Initializer
            {
                ApiKey = ApiKey,
                //HttpClientFactory = new ProxySupportedHttpClientFactory()
            };
            var service = new UrlshortenerService(initializer);
            var longUrl = "http://wwww.google.com/";
            var response = service.Url.Insert(new Url { LongUrl = longUrl }).Execute();

            Console.WriteLine($"Short URL: {response.Id}");
            Console.ReadKey();
        }
    }
}

If you are behind a firewall you may need to use a proxy. Below is an implementation of the ProxySupportedHttpClientFactory, which is commented out in the sample above. Credit for this goes to this blog post.

class ProxySupportedHttpClientFactory : HttpClientFactory
{
    private static readonly Uri ProxyAddress 
        = new UriBuilder("http", "YourProxyIP", 80).Uri;
    private static readonly NetworkCredential ProxyCredentials 
        = new NetworkCredential("user", "password", "domain");

    protected override HttpMessageHandler CreateHandler(CreateHttpClientArgs args)
    {
        return new WebRequestHandler
        {
            UseProxy = true,
            UseCookies = false,
            Proxy = new WebProxy(ProxyAddress, false, null, ProxyCredentials)
        };
    }
}
一曲爱恨情仇 2024-12-21 11:41:47

怎么样

   var requestContent = new FormUrlEncodedContent(new[] 
        {new KeyValuePair<string, string>("longUrl", s),});

改成

   var requestContent = new StringContent("{\"longUrl\": \" + s + \"}");

How about changing

   var requestContent = new FormUrlEncodedContent(new[] 
        {new KeyValuePair<string, string>("longUrl", s),});

to

   var requestContent = new StringContent("{\"longUrl\": \" + s + \"}");
眼眸印温柔 2024-12-21 11:41:47

以下是我的工作代码。可能对你有帮助。

private const string key = "xxxxxInsertGoogleAPIKeyHerexxxxxxxxxx";
public string urlShorter(string url)
{
            string finalURL = "";
            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 = "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();
                            finalURL = Regex.Match(json, @"""id"": ?""(?.+)""").Groups["id"].Value;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // if Google's URL Shortener is down...
                System.Diagnostics.Debug.WriteLine(ex.Message);
                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
            }
            return finalURL;
}

Following is my working code. May be its helpful for you.

private const string key = "xxxxxInsertGoogleAPIKeyHerexxxxxxxxxx";
public string urlShorter(string url)
{
            string finalURL = "";
            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 = "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();
                            finalURL = Regex.Match(json, @"""id"": ?""(?.+)""").Groups["id"].Value;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // if Google's URL Shortener is down...
                System.Diagnostics.Debug.WriteLine(ex.Message);
                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
            }
            return finalURL;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文