2011-11-06 10 views
9

Chcę wywołać google url shortner API z mojego C# Console Application, wniosek staram się realizować to:nazywając google Url Shortner API w C#

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

Content-Type: application/json

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

Kiedy próbuję użyć tego kodu:

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

a główną metodą jest:

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(); 
} 

pojawia się kod błędu 400: Ten interfejs API nie obsługuje parsowania wejście zakodowane w formie. Nie wiem, jak to naprawić.

Odpowiedz

14

można sprawdzić poniższy kod (wykorzystały System.Net). Powinieneś zauważyć, że typ treści musi być określony i musi to być "application/json"; a także ciąg do wysłania musi być w formacie 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); 
      } 

     } 

    } 
} 
+0

'ciąg ciąg MATCH_PATTERN = @" "" id "":? "" (? . +) "" "; Console.WriteLine (Regex.Match (responseText, MATCH_PATTERN) .Groups ["id"]. Wartość); 'dostaje skrócony URL. –

+0

application/json był dla mnie brakującym elementem. Używał text/json, jak idiota. – Jon

2

Jak o zmianę

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

do

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

daje ten błąd: Argument 2: nie można przekonwertować z „string” do System.Net.Http.HttpContent” – SKandeel

+0

przykro z tego powodu, aktualizowane na odpowiedź –

+0

Błąd:«System.Net.Http.HttpContent»robi nie zawiera definicji "CreateEmpty" – SKandeel

1

Oto mój działający kod. Może być pomocny dla ciebie.

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; 
} 
2

Google ma pakiet NuGet do korzystania z interfejsu API Urlshortener. Szczegóły można znaleźć here.

podstawie this example byłoby wdrożyć go jako takie:

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(); 
     } 
    } 
} 

Jeżeli jesteś za firewallem może trzeba korzystać z serwera proxy. Poniżej znajduje się implementacja ProxySupportedHttpClientFactory, która jest opisana w powyższym przykładzie. Kredyt na to idzie do 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) 
     }; 
    } 
}