2011/02/14(月)Google の URL 短縮 API を VB から使ってみれなかった
手元の apache で POST されたデータを見る分にはうまく行ってるように見えるんだけど、なにかが google さんのお気に召さないらしい。
コード 400 で、longUrl パラメータが無いぞ、と言われてしまう。
なんで VB なのかっていうと、某アプリに組み込みたいので。
しばらく待てば作者の人が実装してくれる気がしないでもない。
以下、コード。
Imports System Imports System.IO Imports System.Net Imports System.Text Module Module1 Sub Main() Dim longUrl As String = "http://www.youtube.com/watch?v=alaZzDxxQAM" 'Dim longUrlEnced As String = HttpUtility.UrlEncode(longUrl) Dim PostData As String = "{""longUrl"": """ & longUrl & """}" Dim PostDataBytes As Byte() = Text.Encoding.UTF8.GetBytes(PostData) If (0) Then Dim stdout As Stream = Console.OpenStandardOutput() stdout.Write(PostDataBytes, 0, PostDataBytes.Length) stdout.Close() Console.WriteLine(ControlChars.CrLf) End If If (1) Then Dim req As HttpWebRequest = System.Net.WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url") 'Dim req As HttpWebRequest = System.Net.WebRequest.Create("http://192.168.0.101/experiment/post.pl") req.Method = "POST" req.ContentType = "Content-Type: application/json; charset=UTF-8" Dim reqStream As System.IO.Stream = req.GetRequestStream() reqStream.Write(PostDataBytes, 0, PostDataBytes.Length) reqStream.Close() Dim res As WebResponse Try res = req.GetResponse() Catch ex As WebException res = CType(ex.Response, System.Net.HttpWebResponse) End Try Dim resStream As Stream = res.GetResponseStream() Dim resReader As New StreamReader(resStream) Dim str As String = resReader.ReadToEnd() resReader.Close() resStream.Close() Console.WriteLine(str) End If End Sub End Moduleこんな応答。
>glshortener.exe { "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Required", "locationType": "parameter", "location": "resource.longUrl" } ], "code": 400, "message": "Required" } }こんな感じの CGI を用意してそこにリクエストを送ってみる。
#! /usr/bin/perl use CGI; use strict; my $q = new CGI(); print "Content-Type: text/html\n\n"; print print_header; print "\npost.pl\n"; my @names = $q->param; foreach my $i (@names) { print "$i:"; print $q->param($i); print "\n"; }
>glshortener.exe post.pl POSTDATA:{"longUrl": "http://www.youtube.com/watch?v=alaZzDxxQAM"}リクエストはうまく送られているようにみえるが、何がいけないんだろう?
URL は URLエンコードする必要はないし、もしそれが原因なら required ではなく invalid が返るはず。う~ん。