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

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

ただいまの
回答率

88.61%

C#, HttpClientでTodo.lyにPostしたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,378

cancat

score 249

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

前提・実現したいこと

C#, HttpClientでTodo.lyにPostしたいです。

試したこと

下記の通り。

発生している問題・エラーメッセージ

{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Cache-Control: private
Date: Thu, 08 Dec 2016 09:16:19 GMT
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 3420
Content-Type: text/html; charset=utf-8
}}

該当のソースコード

using System.Collections.Generic;
using System.Net.Http;

namespace Todoly {
    public partial class Todoly {
        public async void PostItems(string message) {
            message = "カーテン。";

            if (NeedAuth()) {
                var tokenResponse = await client.GetAsync(TokenUri);
            }

            var content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                { "Content", message }
            });

            var response = await client.PostAsync(UriOfItems, content);

            var resultString = await response.Content.ReadAsStringAsync();

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ざっくり書きますが、エラーは無効なPOSTをしているからで、無効とは、POSTしたコンテンツのことをさしていると思います。
APIの仕様見るところだと、例えば

public class TodoModelBase
{
     public string Content { get; set; }
}


っていうSend用のModel(クラス名適当です)があると仮定すれば、

var model = new  { Content = "crate demo." };
var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");


でしょうか。(1プロパティだけなのでTodoModelBaseをつくらずjsonを書けばよいってのはありますが、inputのmodelをjsonにかえるという汎用性を考えて作ってます)

ってかこのシリーズの投稿に連投で回答して感じていることで余計なお世話かとは思いますが、
もうちょっとプログラムというものを理解するための学習をした方が良いかと思います。なんのためにどのオブジェクトが必要かとか、使っているオブジェクトがどう動くかを理解せず、何かわからないものをつなげてるだけだと前に進まないと思います。これ系が初めてとか関係ないかと....スキル習得は必要でないのであればよいのですが。

それを理解していれば、Todolyなんて使ったことないしBasic認証なんて使った記憶すら残っていない私でも、APIの仕様とHTTPのPOSTをするってことはどうゆーことなのかという理解だけでさらっと作れてしまうので....そうなるとプログラミングをもっと楽しめるようになると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/09 00:10

    ありがとうございます。
    スキル習得はもちろんしたいです。
    Todo.lyのAPIはもちろん見ています。

    たとえばItemObject-Contentとあるときに、それもJSONにするためのクラスが必要なのだろうか? POSTのときにResponseで返ってくるような細かい設定はできないのだろうか? とか、山ほど疑問点はあり、なかなか解決できずにいます。
    たとえば今回のコードだと、いきなりJsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"などがでてきますが、このあたりをいきなり書くのは、まだむずかしそうです。

    とはいえ、すこしずつ書けるようにはなっていると思いますので、もうすこしおつきあいいただければ幸いです。
    HttpClientの使い方の入門サイトとかで、よいところがあればご紹介ください。

    キャンセル

  • 2016/12/09 10:19

    「いきなりJsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"などがでてきますが、このあたりをいきなり書くのは...」とおっしゃってますが...

    たぶん難しく考えすぎで、
    「Contentにjsonの文字列が必要だ(プログラミングの問題ではなく、POSTとTodoly側の都合なのでC#関係ない)」
    →「json文字列を手で書くのめんどくさーいけど、classをjsonにすることはできる」
    →「デシリアライズすればいいよね。とりあえずTodolyのAPI仕様見るのめんどくさいからUTF8にしときゃいいでしょ、ダメだったらその時なおす」

    と論理的に考えて(論理的かどうかはさておき...w)書いてるだけなので、HttpClientがーとかC#でWebがーとかの話ではないです(あくまで私個人的な考え方です...)。C#やHttpClientはただの手段です。目的ありき手段を使うのに、目的が不明確なので手段として何していいか精査できていないってやつ。

    HttpClientに入門するほどの内容ないです。MSDNを見ましょう。
    ただ、それを見て理解するためC#に入門された方がよいと感じます。この部分や、やったことのない他の部分もサクッとできるようになる近道です(と思っています...)。
    ということで、(私の個人的なおすすめとして)
    http://ufcpp.net/study/csharp/
    でC#の基礎を学んでいただければと。ここのブログもそうですが、正しい情報(新しくなった情報がきっちり更新されている)がきっちりまとまっている、世界でみても最高級のサイトです(←あくまで私個人的な思いですよw)。

    ググって適当なサイトを見ても、古い情報=正しくない情報なことも多いものを見て学んでも無駄です。ググってWebRequestの情報見つけてコピペでコード作ったなんかだと絶望的です。(私の社内だと「なんで紀元前のコード書いているの?理由は?妥当性は?」と言われます)

    ということでちょっと干渉しすぎましたね。失礼しました。ながーくなってしまいましたが楽しんでいただければと....。

    (HttpClientですか....気が向いたら自分のブログに書きますね...)

    キャンセル

  • 2016/12/09 13:00

    ありがとうございます。
    未確認飛行は、よく参考にしています。
    新しい書き方はとてもスマートになっているので、採り入れたいです。

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る