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

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

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

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

Q&A

解決済

1回答

2924閲覧

C#でトークンをセットしたい

cancat

総合スコア313

C#

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

0グッド

0クリップ

投稿2016/12/05 13:52

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

###前提・実現したいこと
Todo.lyのタスクを管理したいです。
トークンのセット方法がわからずにいます。

###試したこと
resultがNot Authenticated

###発生している問題・エラーメッセージ
{"ErrorMessage":"Not Authenticated","ErrorCode":102}

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

C#

1var byteArray = Encoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password)); 2client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 3 4// 受け入れ言語をセット 5client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 6HttpResponseMessage = await client.GetAsync(tokenuri); 7string result = await response.Content.ReadAsStringAsync(); 8token = JsonConvert.DeserializeObject<Token>(result); 9 10List<TodolyObject> tasks = new List<TodolyObject>(); 11var uri = "https://todo.ly/api/items.json"; 12 13client = new HttpClient(); 14client.DefaultRequestHeaders.Add("User-Agent", useragent); 15// 受け入れ言語をセット 16client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 17client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token.TokenString); 18 19HttpResponseMessage response = await client.GetAsync(uri); 20string result = await response.Content.ReadAsStringAsync(); 21tasks = JsonConvert.DeserializeObject<List<TodolyObject>>(result); //<--ここでerror

###補足情報(言語/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

ベストアンサー

前提:
ざっくり雑にサンプル書きました。(実務では出てこないだろーくくそコードなので、実務で使うならちゃんとしてくださいねw)

以下のクラスがあるとして、

csharp

1public class TodolyClient 2{ 3 #region variables 4 5 private const string UserName = ""; 6 private const string Password = ""; 7 8 private const string BaseUri = "https://todo.ly"; 9 private const string TokenUri = "api/authentication/token.json"; 10 private static string UriOfItems = "api/items.json"; 11 12 private static HttpClient _client; 13 private static DateTime? ExpirationTime = null; 14 15 #endregion 16 17 #region ctor 18 19 static TodolyClient() 20 { 21 var credentials = Encoding.ASCII.GetBytes($"{UserName}:{Password}"); 22 23 _client = new HttpClient(); 24 _client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 25 _client.BaseAddress = new Uri(BaseUri); 26 _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); 27 // TODO ヘッダーへの設定はここで 28 29 } 30 31 #endregion 32 33 public async Task<dynamic> GetAllItems() 34 { 35 36 if (NeedAuth()) 37 { 38 var tokenResponse = await _client.GetAsync(TokenUri); 39 // TODO トークン取得後にExpirationTimeを取得してローカルに保存とかすればいいかと。 40 } 41 42 var response = await _client.GetAsync(UriOfItems); 43 var resultString = await response.Content.ReadAsStringAsync(); 44 45 return JsonConvert.DeserializeObject<dynamic>(resultString); 46 47 } 48 49 #region private 50 51 private static bool NeedAuth() 52 { 53 if (ExpirationTime == null) return true; 54 return ExpirationTime < GetDateTime(); 55 } 56 57 // TODO とりあえずNowを返してますが、UTC対応が必要だと思うので、ここをカスタマイズする必要あるかなと 58 private static DateTime GetDateTime() => DateTime.Now; 59 60 #endregion 61}

どっかでインスタンス化して、

csharp

1var todolyClient = new TodolyClient();

使う。

csharp

1var items = await todolyClient.GetAllItems();

です。とりあえずなコードなので、dynamicで返してますが、必要に応じて直してくれればと。
認証は、有効期間がTodo.lyから何取得できるのか知らんので(UTCの時間?Ticks?とか)、てきとーに書いてます。状況に応じてコードを直していただければと。
最初に書きましたが、あくまでサンプルレベルのくそコードなので、Disposeしてないとか色々ありますが、そこはお察しいただければとw。

投稿2016/12/06 03:11

BEACHSIDE

総合スコア294

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

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

cancat

2016/12/06 05:12

ありがとうございます。 これは趣味のプログラムなので、楽しみます。 仕事ではDisposeに悩まされてます。。。。 有効期間は昨日とったところでは、UnixEpocではなかったみたい。 夜に試します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問