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 が返るはず。う~ん。