こんにちは、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でした。
{
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 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();
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);
}
string end_boundryString = “\r\n” + “–” + boundryString + “–” + “\r\n”;
byte[] buf1 = Encoding.UTF8.GetBytes(body);
byte[] buf2 = fileBuf;
byte[] buf3 = Encoding.UTF8.GetBytes(end_boundryString);
byte[] payload = rv.ToArray();
var response = Request.Post(urltl, payload, ContentType);
同じエラーで悩んでいる方に私からのささやかなクリスマスプレゼントです。
よいクリスマスになりますように。。。
【メンバー募集中】
truestarでは、新しい仲間を募集しています。詳細は以下をご覧ください。
株式会社truestar採用サイト https://en-gage.net/truestar/