質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

1464閲覧

C#でTodo.lyにPostでItemを追加したいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

0グッド

0クリップ

投稿2016/12/07 13:59

こんにちは。
Windows10でWPFのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
Todo.lyにPostでItemを追加したいです。

###試したこと
下記のとおり。

###発生している問題・エラーメッセージ
Postされないです。。。
エラーも発生しないです。

###該当のソースコード

C#

1 private const string UserName = "cancat"; 2 private const string Password = "password"; 3 private const string useragent = "Shin-Mozilla/5.5 (Windows NeXT 5.5; Trident/7.0; rv:11.0) like GeckohKamen"; 4 5 private const string BaseUri = "https://todo.ly"; 6 private const string TokenUri = "api/authentication/token.json"; 7 private static string UriOfItems = "api/items.json"; 8 9 private static HttpClient client; 10 private static DateTime? ExpirationTime = null; 11 12 static Todoly() { 13 var credentials = Encoding.ASCII.GetBytes($"{UserName}:{Password}"); 14 15 client = new HttpClient(); 16 client.DefaultRequestHeaders.Add("User-Agent", useragent); 17 client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 18 client.BaseAddress = new Uri(BaseUri); 19 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); 20 } 21 22 private void Window_Loaded(object sender, RoutedEventArgs e) { 23 todoly(); 24 } 25 26 private async void todoly() { 27 var todoly = new Todoly.Todoly(); 28 //var items = await todoly.GetAllItems(); 29 todoly.PostItems(""); 30 } 31 32 public void PostItems(string message) { 33 message = "カーテン。"; 34 35 var encode = Encoding.GetEncoding("UTF-8"); 36 var postData = "Content=" + Uri.EscapeDataString(message); 37 var postDataBytes = encode.GetBytes(postData); 38 39 // WebRequest作成 40 var requestUrl = string.Format(BaseUri, UriOfItems); 41 var request = WebRequest.Create(requestUrl); 42 request.Method = "POST"; 43 request.ContentType = "application/x-www-form-urlencoded"; 44 // POSTデータ長を指定 45 request.ContentLength = postDataBytes.Length; 46 try { 47 // データをPOST送信するためのStreamを取得 48 var requestStream = request.GetRequestStream(); 49 // 送信するデータを書き込む 50 requestStream.Write(postDataBytes, 0, postDataBytes.Length); 51 requestStream.Close(); 52 } 53 catch (WebException webexception) { 54 string error = webexception.Response.ToString(); 55 } 56 catch (Exception exception) { 57 string error = exception.Message; 58 } 59 } 60 } 61} 62//http://todo.ly/apiwiki/?items/todo-ly-rest-api-method-post-items 63 64 65 66

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

突っ込みどころが多すぎるのでパタパタと書きますが....

var requestUrl = string.Format(BaseUri, UriOfItems);
ってrequestUrlになにはいってますかね?謎いです。(BaseUriの値を見る限りstring.Formatして何か値が変わることがないの)

private async void todoly() {のasyncにvoid使うのはここではバットプラクティスですし、場合によっては非同期処理がしぬかと。
(async/awaitの仕組みや基礎をさっと語るだけだと語弊しか生まれないので説明はしませんが、いろんな方が記事書いてますので整理したほうが良いかと思います。)

そしてなぜWebRequestを使っちゃったんでしょう...HttpClientがあるので、それを使えばよいかと。BaseUri(https://todo.ly)がセットされているインスタンスがあるのでそれを利用して、PostAsyncすればさらっと接続できると思います。
(これも詳しくは語りませんが、私個人的にはWebRequest is deadです。)

投稿2016/12/08 06:00

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2016/12/08 06:40

コメントありがとうございます。 以前、chatworkに投稿できまして、それをベースにしてみました。 Webとのやりとりのコード、ほんっとに初心者なのです。 そのChatworkのときが初めてで、今回が2回目。 まだまだ五里霧中です。。。 WebRequestだめなのですね。そうかインスタンス引き継がれないですね。なるほど。
BEACHSIDE

2016/12/08 06:52

動作を実現できるかどうかの話だとWebRequestでも全く問題ないです。 ただ、HttpClient使って認証とか色々設定されているのに、それ使わず別のClient立てる(かつ、古いクラスなので設定したりPostしたりするのすらめんどい)のは微妙って話ですね。
cancat

2016/12/08 09:00

あらためて。 using System; using System.Text; namespace Todoly { public partial class Todoly { public async void PostItems(string message) { message = "カーテン。"; var encode = Encoding.GetEncoding("UTF-8"); var postData = "Content=" + Uri.EscapeDataString(message); var postDataBytes = encode.GetBytes(postData); if (NeedAuth()) { var tokenResponse = await client.GetAsync(TokenUri); } var response = await client.PostAsync(UriOfItems, message); var resultString = await response.Content.ReadAsStringAsync(); }}} としてみました。 message(string)をSystem.Net.Http.HttpContentにできればよさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問