2011/02/14(月)Google の URL 短縮 API を VB から使ってみれなかった

Google URL Shortener API を VB.Net から使ってみようとして挫折した。
手元の 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 が返るはず。う~ん。