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

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

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

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1608閲覧

Todo.lyで終わったアイテムにチェックして終了状態にしたいです。

cancat

総合スコア313

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/07/08 14:34

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

###前提・実現したいこと
Todo.lyで終わったアイテムにチェックして終了状態にしたいです。

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

C#

1public async Task DoneItem(TodolyModel message) { 2 if (NeedAuth()) { 3 var tokenResponse = await client.GetAsync(TokenUri); 4 } 5 string doneurl = "https://todo.ly/api/projects/********/doneitems.json"; 6 Process.Start(doneurl); 7 var response = await client.GetAsync(doneurl); 8}

###発生している問題・エラーメッセージ
これで、
responseの内容は、{StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
です。

いっぽうで、Process.StartしたURLをブラウザで開くと、下記のようになっています。
{"ErrorMessage":"You don\u0027t have access to this Project","ErrorCode":402}
いずれにしても、そのアイテムをチェックして終了できないでいます。
どうすればよいか、アドバイスお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

client はトークンをサーバから貰って認証の通ったクッキーを保持しています。かたやブラウザはその認証行為を行っていません。

なのでブラウザでエラーが出るのは正しい動作です。

client の方は認証が通っているので、引き続き API を実行したら良いと思います。

ただしトークンを貰ったと思うのでそれを Token という HTTP ヘッダに足してアクセスして下さい。

投稿2017/07/08 15:04

編集2017/07/08 15:07
mattn

総合スコア5030

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

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

mattn

2017/07/08 15:05

あーすいません。回答内容間違ってますね。書き足します。
mattn

2017/07/08 15:08

書き換えました。
cancat

2017/07/09 11:45

ありがとうございます。 clientを見たところ、 private static HttpClient client; static Todoly() { var credentials = Encoding.ASCII.GetBytes($"{UserName}:{Password}"); client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); client.BaseAddress = new Uri(BaseUri); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); } となっていて、AuthenticationHeaderのBasicには、それらしき値があるようです。 HttpClientにはTokenというプロパティは見当たらないのですが、どのように追加すればよいですか?
mattn

2017/07/09 11:52

HttpClient なので client.DefaultRequestHeaders.Add("Token", xxx); で行けるかと思います。
cancat

2017/07/09 13:30

Token token=null; if (NeedAuth()) { var tokenResponse = await client.GetAsync(TokenUri); string result = await tokenResponse.Content.ReadAsStringAsync(); token = JsonConvert.DeserializeObject<Token>(result); } string doneurl = BaseUri + "/api/projects/" + message.Id + "/doneitems.json"; client.DefaultRequestHeaders.Add("Token", token.TokenString); としましたが、下記のエラーでした。 {"ErrorMessage":"You don\u0027t have access to this Project","ErrorCode":402}
mattn

2017/07/09 14:12

下記のエラーとおっしゃっておられるのはどこに出たエラーですか?Visual Studio ですか?
cancat

2017/07/10 05:57

いいえ。 var response = await client.GetAsync(doneurl); のなかみです。
cancat

2017/07/10 06:11

それっぽい値は入ってます。
mattn

2017/07/10 06:15

今気付いたのですが、今の状態ですと basic 認証と token が両方設定されている事になってしまっていますね。毎回 basic 認証で行われたいのであれば token の処理は必要無かったです。すいません。 token でアクセスされたいのであれば、basic 認証を消した方がよいかもしれません。
cancat

2017/07/10 11:22

string doneurl = BaseUri + "/api/projects/" + message.Id + "/doneitems.json"; client.DefaultRequestHeaders.Add("Token", token.TokenString); client.DefaultRequestHeaders.Authorization = null; var nowresponse = await client.GetAsync(doneurl); var nowresultString = await nowresponse.Content.ReadAsStringAsync(); として、Authorizationはnullでした。 nowresponseは {Method: GET, RequestUri: 'https://todo.ly/api/projects/*******/doneitems.json', Version: 1.1, Content: <null>, Headers: { User-Agent: Mozilla/5.5 User-Agent: (Windows 5.5; Trident/7.77; rv:11.1) User-Agent: like User-Agent: Gecko Accept-Language: ja-JP Token: ********************** }} でした。 nowresultは "{\"ErrorMessage\":\"You don\\u0027t have access to this Project\",\"ErrorCode\":402}" 消えず。うーむ。
cancat

2017/07/10 14:04

ほんとですか! 今日はもうダウンなので、また明日試してみます。 B.G.M.目をとじて小旅行(イクスカーション)
cancat

2017/07/11 14:33

失敗しました。 いただいたサンプルをそっくり使ってもダメでした。 それであらためて考えてみました。 var doneuri = "https://todo.ly/api/projects/" + "0" + "/doneitems.json"; のうち"0"はIDなのですが、消そうと思っているアイテムは、 Childを3つもつ。 Id 9****** OwnerId 5***** ProjectId 3****** です。 これまでは、Idを指定していたのですが、これでは消せていません。 Childを0にしてもだめでした。 とすると、Idの代わりに、OwnerIdを入れるか、ProjectIdを入れるかくらいしか思いつきません。 依然苦戦中。
mattn

2017/07/11 15:00

0 はプロジェクトIDです。これを投げると完了したアイテムの一覧が返ります。
mattn

2017/07/11 15:00

あくまで僕の場合の 0 は、の話ですが。
cancat

2017/07/12 05:36

なるほど。自分のコードを見てみたのですが、完了したアイテム一覧は取得できていました。 いま行いたいのは、「未完了のアイテムを完了にすること」です。 ひょっとしてぜんぜん違っていましたか?
cancat

2017/07/12 06:53

あ。やっぱりCheckedをtrueですよね。 それも試したんだけどなー。 よるにまた。
cancat

2017/07/12 11:26

できました。大感謝。
mattn

2017/07/12 12:55

やった! :)
cancat

2017/07/12 13:40

が…。デスクトップアプリケーション(WPF)では動作したのですが、UWPに移植して(というか、クラスは共通なので、そのまま使っています)UWPで動かしたところ、 System.AccessViolationException が発生しました HResult=0x80004003 Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt. とかいわれております…。 別の質問を立てます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問