実現したいことは以下のサイトのブロードキャストメッセージを送るの部分です。
Messaging APIリファレンス
他サイトを参考に以下のようなコードを作成しました。
C#
1 // To creat HttpClient 2 var client = new HttpClient(); 3 4 // Accesstoken 5 var accessToken = "token"; 6 7 // URL 8 var url = "https://api.line.me/v2/bot/message/multicast"; 9 10 // Message 11 var json = "{ \"type\" : text, \"text\" : \"Hello World\" }"; 12 // var content = new StringContent("{ \"your\": \"content\", \"maybe\": \"json\" }"); 13 // content.Headers.Add("X-SOME-RANDOM", "header-value"); 14 15 var request = new HttpRequestMessage(HttpMethod.Get, url); 16 // Request Header 17 request.Headers.Add("ContentType", "application/json"); 18 request.Headers.Add("Authorization", "Bearer " + accessToken); 19 // Request Body 20 request.Headers.Add("to", "userId"); 21 request.Headers.Add("messages", json); 22 var response = await client.SendAsync(request);
これを実行するとインターナルサーバーエラーになります。
リクエストヘッダーを設定する箇所は以下のサイトを参考にしました。
HttpClient でリクエストヘッダを設定する
リクエストヘッダーをそのまま、リクエストボディに適用した形です。
これだとよろしくないのでしょうか。
追記⓵
リクエストヘッダーとボディを分けるところは完成しましたが、どのようにして
ヘッダーにAuthorizationを設定すればよいでしょうか。現在のコードは以下です。
C#
1 var json = @"{""type"":""text"", ""text"":Hello World}"; 2 var content = new StringContent(json, Encoding.UTF8, @"application/json"); 3 4 using (var client = new HttpClient()) 5 { 6 var response = await client.PostAsync($"http://foo.example.com", content); 7 }
追記⓶
現在のコードは以下です。ボディとヘッダーを同時に設定できました。
C#
1 // To creat HttpClient 2 var client = new HttpClient(); 3 4 // Accesstoken 5 var accessToken = "token"; 6 7 // URL 8 var url = "https://api.line.me/v2/bot/message/broadcast"; 9 10 11 var request = new HttpRequestMessage(HttpMethod.Post, url); 12 // Request Header 13 request.Headers.Add("Authorization", "Bearer " + accessToken); 14 var parameters = new Dictionary<string, string>() 15 { 16 { "messages", "Hello World" }, 17 }; 18 19 request.Content = new StringContent( 20 parameters.ToString(), 21 Encoding.UTF8, 22 "application/json" 23 ); 24 25 await client.SendAsync(request);//ここでデバックで停止
値も指定通りになっている気がします。
特にサーバーエラー等は出ていません。
追記⓷
現在、ローカルホストを外部に公開するためにngrokを使用しています。そこでは200Okのレスポンスが返ってきます。
が、fiddlerではエラーになっているようです。
以下がその画面と、現在のコードです。
// To creat HttpClient var client = new HttpClient(); // Accesstoken var accessToken = "token="; // URL var url = "https://api.line.me/v2/bot/message/broadcast"; // POST var request = new HttpRequestMessage(HttpMethod.Post, url); // Request Header request.Headers.Add("Authorization", "Bearer " + accessToken); var str1 = new Dictionary<string, string>(); str1.Add("type", "text"); str1.Add("text", "test test test"); var str2 = new Dictionary<string, Dictionary<string, string>>(); str2.Add("messages", str1); var json = JsonConvert.SerializeObject(str2); request.Content = new StringContent( json.ToString(), Encoding.UTF8, "application/json" ); await client.SendAsync(request);
追記④
現在POSTでブロードキャストメッセージを送ると以下のようにFiddlerに表示されます。
POST https://api.line.me/v2/bot/message/broadcast HTTP/1.1 Authorization: Bearer my token Content-Type: application/json; charset=utf-8 Host: api.line.me Content-Length: 52 Expect: 100-continue Connection: Keep-Alive {"messages":{"type":"text","text":"test test test"}}
レスポンスは400(Bad request)になっています。
見た感じだと、APIリファレンスの要求に沿っている気がするのですが、どこかおかしいい箇所がありますでしょうか。
ちなにみに以下が現在成功している、マルチメッセージのFiddlerの結果です。比べても大きな違いはない気がします。
また、マルチメッセージはテンプレートの既存メソッドを指定しています。
POST https://api.line.me/v2/bot/message/multicast HTTP/1.1 Authorization: Bearer my token Content-Type: application/json; charset=utf-8 Host: api.line.me Content-Length: 143 Expect: 100-continue Connection: Keep-Alive {"to":["ID1","ID2"],"messages":[{"type":"text","text":"マルチメッセージ"}]}
回答3件
あなたの回答
tips
プレビュー