Tableau RestAPI Bad Request 400011 対応

こんにちは、truestar工房のmimuraです。

一気にPublishするToolつくるのに苦労した話

複数のtwbxファイルやhyperファイルを一気にPublishするToolをつくれば、喜んでもらえるかなぁ。。。

そんな思いで作り始めました、通称「あげあげ」。(Serverに上げて、上げて。。。)

社内環境はWindowsだから、JavaやPythonだと別途インストール作業が必要になるから避けたいし、やっぱりお手軽exe形式がいいなってことで言語はC#。

RestAPIでサインインして、サイトID獲得して、プロジェクトID獲得して。。。順調♪順調♬ と思いきや、あれ。。。Publishできない。。。何度やっても Bad Request 400011。。。

ググっても良い情報にありつけず。みんなおんなじエラーで悩んでる。。。

初心にかえり、リファレンスガイドを読み返す。

Note: The content being published should not be encoded (for example, using Base-64 or UTF-8).

。。。そぅなんですね、ファイルはエンコーディングしてはならないんですね。。。

なので、電文にはファイル前と後ろはUTF-8で設定して、ファイルはバイナリのまま設定して送信すればOKでした。

    internal override void Execute()
{
using (XmlWriter publishxml = XmlWriter.Create(“publish.xml”))
{
publishxml.WriteStartDocument();
publishxml.WriteStartElement(“tsRequest”);
publishxml.WriteStartElement(RestApi.PublishXml);
publishxml.WriteAttributeString(“name”, RestApi.Name);
publishxml.WriteStartElement(“project”);
publishxml.WriteAttributeString(“id”, RestApi.project_id);
publishxml.WriteEndElement();
publishxml.WriteEndElement();
publishxml.WriteEndElement();
publishxml.WriteEndDocument();
}
XElement myxml = XElement.Load(“publish.xml”);
string xmlstring = myxml.ToString();
      var boundryString = Guid.NewGuid().ToString().Replace(“-“, string.Empty);
      // file前
var body =
“–” + boundryString + “\r\n” +
“Content-Disposition: name=\”request_payload\”” + “\r\n” +
“Content-Type: text/xml” + “\r\n” +
“\r\n” +
xmlstring + “\r\n” +
“–” + boundryString + “\r\n” +
$”Content-Disposition: form-data; name=\”{RestApi.Disposition}\”; filename=\”” + RestApi.FileName + “\”\r\n” +
“Content-Type: application/octet-stream” + “\r\n” +
“\r\n”;
Console.WriteLine(body);
Console.WriteLine();
      // file
var filePath = RestApi.FilePath;
byte[] fileBuf;
using (FileStream fileStream =
new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
BinaryReader binaryReader = new BinaryReader(fileStream);
fileBuf = binaryReader.ReadBytes((int)fileStream.Length);
}
      // file後
string end_boundryString = “\r\n” + “–” + boundryString + “–” + “\r\n”;
      //encode the XML payload
byte[] buf1 = Encoding.UTF8.GetBytes(body);
byte[] buf2 = fileBuf;
byte[] buf3 = Encoding.UTF8.GetBytes(end_boundryString);
      IEnumerable<byte> rv = buf1.Concat(buf2).Concat(buf3);
byte[] payload = rv.ToArray();
      var ContentType = “multipart/mixed; boundary=” + boundryString;
var response = Request.Post(urltl, payload, ContentType);

同じエラーで悩んでいる方に私からのささやかなクリスマスプレゼントです。
よいクリスマスになりますように。。。

 

【メンバー募集中】

truestarでは、新しい仲間を募集しています。詳細は以下をご覧ください。
株式会社truestar採用サイト https://en-gage.net/truestar/