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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

Q&A

解決済

2回答

4382閲覧

C# WPFで作成したプログラムが、POST送信、GET送信した内容を確認する方法が知りたい

kkokuke

総合スコア32

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

0グッド

0クリップ

投稿2021/04/28 07:21

C# WPF(.NET Framework 4.7.2)を使って、HttpClientクラスの学習のために、HTTPリクエストし、テキストを取得するプログラムを作成したいと考えています。

作成したプログラムが、POST送信、GET送信した内容を確認する方法が知りたいです。
合わせて、プログラムの修正方法も教えていただけたらと思います。

現時点では、以下のようなプログラムです。実行して得られたテキストの内容から考えて、うまく、送信されていないように思えます。どんな内容が送信されているかわからないので、どこを直したら良いのかも判断できません。

https://www.bing.com/search?q=C%23+HttpClient+post」を送信し、送り返されたテキストをテキストボックスに表示するプログラムを意図しています。

アプリケーションは、新しいプロジェクトの作成から、WPFアプリ(.NET Framework)・テンプレートを使って作成しています。
実行後、右上「Browse」ボタンを押すと、送り返されたテキストがテキストボックスに格納されます。

クッキーを有効にする、ユーザーエージェントを送信する、ロケールを送信する操作を加える操作では、結果は変化しませんでした。

xaml

1<Window x:Class="PostRequest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 5 Title="GetHtmlDocument" Height="250" Width="350"> 6 <DockPanel> 7 <DockPanel DockPanel.Dock="Top"> 8 <Button DockPanel.Dock="Right" Click="Button_Click">Browse</Button> 9 <TextBox Name="queryBox">httpclient c# post</TextBox> 10 </DockPanel> 11 <TextBox Name="htmlDocument">TextBox</TextBox> 12 13 </DockPanel> 14</Window> 15

xaml.cs

1using System.Collections.Generic; 2using System.Net.Http; 3using System.Windows; 4 5namespace PostRequest 6{ 7 /// <summary> 8 /// MainWindow.xaml の相互作用ロジック 9 /// </summary> 10 public partial class MainWindow : Window 11 { 12 public MainWindow() 13 { 14 InitializeComponent(); 15 } 16 17 private static HttpClient client = new HttpClient(); 18 19 private async void Button_Click(object sender, RoutedEventArgs e) 20 { 21 // クッキーを有効にする 22 var handler = new HttpClientHandler() 23 { 24 UseCookies = true, 25 }; 26 // 送信するクエリを作成する 27 var parameters = new Dictionary<string, string>() 28 { 29 { "p", queryBox.Text }, 30 }; 31 // ユーザーエージェントを設定する 32 client.DefaultRequestHeaders.Add("User-Agent", 33 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) like Gecko"); 34 // ロケールを設定する 35 client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 36 // クエリをpostして、結果をテキストボックスに格納する 37 var response = await client.GetAsync($"https://www.bing.com/search?{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}"); 38 39 htmlDocument.Text = response.ToString(); 40 } 41 } 42} 43

Text

1StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 2{ 3 Transfer-Encoding: chunked 4 Cache-Control: private 5 P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND" 6 Set-Cookie: _EDGE_S=F=1&SID=22E72F78109065D20A053F5F1162646E&mkt=ja-jp; domain=.bing.com; path=/; HttpOnly 7 Set-Cookie: ULC=; domain=.bing.com; expires=Tue, 27-Apr-2021 07:02:49 GMT; path=/ 8 Set-Cookie: _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMS0wNC0yOFQwMDowMDowMFoiLCJJb3RkIjowLCJEZnQiOm51bGwsIk12cyI6MCwiRmx0IjowLCJJbXAiOjF9; domain=.bing.com; expires=Fri, 28-Apr-2023 07:02:49 GMT; path=/ 9 X-SNR-Routing: 1 10 Strict-Transport-Security: max-age=31536000; includeSubDomains; preload 11 X-MSEdge-Ref: Ref A: 456BEE6A10964225A98D76972007BF85 Ref B: TYBEDGE0616 Ref C: 2021-04-28T07:02:48Z 12 Date: Wed, 28 Apr 2021 07:02:48 GMT 13 Content-Type: text/html; charset=utf-8 14} 15

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/28 08:03

> 「https://www.bing.com/search?q=C%23+HttpClient+post」を送信し、送り返されたテキストをテキストボックスに表示するプログラムを意図しています。 相手を考え直した方が良いと思います。今の相手では、WPF + HttpClient アプリからの要求に応じて期待通り応答が返ってきているか分からないのでは? 自分で ASP.NET Web API アプリを作って Visual Studio で起動して IIS Express 上で動かして、それに WPF + HttpClient アプリでアクセスすることを考えてみてください。
退会済みユーザー

退会済みユーザー

2021/04/28 08:09

例えば、自分で以下のような ASP.NET Web API を作り、 ASP.NET MVC に Web API 追加 http://surferonwww.info/BlogEngine/post/2018/12/22/adding-webapi-to-existing-mvc-application.aspx それに以下のような HttpClient を使ってアプリでアクセスするということです。 HttpClient で ASP.NET Web API にアクセス http://surferonwww.info/BlogEngine/post/2019/09/29/call-aspnet-web-api-from-httpclien.aspx 両方とも 100% アンダーコントロールなので、サーバーから帰ってくるものが何だか不明というような状況での暗中模索に費やす時間が大幅に減るはずです。
kkokuke

2021/04/28 08:12

ブラウザでアクセスしたときのソース表示と比較して、その違いを確認しています。 何らかのサーバーアプリケーションを作成するスキルがあれば、動作確認用のサーバアプリケーションを作成して、確認するほうが良いのは理解できるのですが、なにも使えないのです。現状、ASP.NETも使えません。 何か、良い方法があると良いのですが...。
退会済みユーザー

退会済みユーザー

2021/04/28 08:14

> ブラウザでアクセスしたときのソース表示と比較して、その違いを確認しています。 radian さんが回答しているように Fiddler で見ればいいです。
退会済みユーザー

退会済みユーザー

2021/04/28 08:18

> 動作確認用のサーバアプリケーションを作成して、確認するほうが良いのは理解できるのですが、なにも使えないのです。 自分で作れないなら、API 仕様が明確に決まっている Web API サイトを探しましょう。とにかく、今の相手でブラウザとあなたのアプリの要求・応答の違いを見ても何にも役に立つものは無いと思いますよ。
kkokuke

2021/04/28 08:27

ありがとうございます。Web API サイト探してみます。
guest

回答2

0

送信内容を確認したいだけなら、Fiddler でも使ったほうがいいと思いますが。

投稿2021/04/28 08:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kkokuke

2021/04/28 08:24

Fiddlerインストーして、チャプター状態でアプリケーションを実行して見たのですが、「Inspectors」の「Raw」や「TextView」の中に、「q=C%23+HttpClient+post」に相当する部分が見つけられないのです。 どこを確認したら良いのでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/28 08:27

多機能なソフトなんで、ソフトの使い方はググって調べてみた方がいいと思います。
kkokuke

2021/04/28 08:29

ありがとうございます。ググってみます。
guest

0

自己解決

汎用的な、POST送信、GET送信した内容を確認する方法は、わかりませんでしたが、リクエストした文字列は、確認することができました。

Webサイト「C# 今更ですが、HttpClientを使う」のコードを参考にしたのですが、

恥ずかしながら、C#6.0から登場した文字列補間構文 $”{}” を知りませんでした。
それに気がついて、簡単な文字列の結合であることを理解しました。

新たに、テキストボックスをUIに追加し、コードを追加し、リクエスト文字を付加したURLを確認できました。

C#

1// リクエスト文字列を確認する 2sendUrl.Text = $"https://www.bing.com/search?{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}";

その結果、意図した文字列が得られていることが確認できました。

Text

1https://www.bing.com/search?p=httpclient+c%23+post

SurferOnWwwさんのご指摘のとおり、動作確認に使用したサイトの選択が悪かったようです。
radianさんもFiddlerを教えてくれてありがとうございます。

他のWeb API サイトを探して、動作を確認してみようと思います。

修正したコードを添付します。

xaml

1<Window x:Class="PostRequest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 5 Title="GetHtmlDocument" Height="250" Width="350"> 6 <DockPanel> 7 <DockPanel DockPanel.Dock="Top"> 8 <Button DockPanel.Dock="Right" Click="Button_Click">Browse</Button> 9 <TextBox Name="queryBox">httpclient c# post</TextBox> 10 </DockPanel> 11 <TextBox Name="sendUrl" DockPanel.Dock="Top">sendUrl</TextBox> 12 <TextBox Name="htmlDocument">TextBox</TextBox> 13 14 </DockPanel> 15</Window> 16

xaml.cs

1using System; 2using System.Collections.Generic; 3using System.Net.Http; 4using System.Windows; 5 6namespace PostRequest 7{ 8 /// <summary> 9 /// MainWindow.xaml の相互作用ロジック 10 /// </summary> 11 public partial class MainWindow : Window 12 { 13 public MainWindow() 14 { 15 InitializeComponent(); 16 } 17 18 private static HttpClient client = new HttpClient(); 19 20 private async void Button_Click(object sender, RoutedEventArgs e) 21 { 22 // クッキーを有効にする 23 var handler = new HttpClientHandler() 24 { 25 UseCookies = true, 26 }; 27 // 送信するクエリを作成する 28 var parameters = new Dictionary<string, string>() 29 { 30 { "p", queryBox.Text }, 31 }; 32 // ユーザーエージェントを設定する 33 client.DefaultRequestHeaders.Add("User-Agent", 34 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) like Gecko"); 35 // ロケールを設定する 36 client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 37 // タイムアウトを設定する 38 client.Timeout = TimeSpan.FromSeconds(10.0); 39 // リクエスト文字列を確認する 40 sendUrl.Text = $"https://www.bing.com/search?{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}"; 41 // クエリをpostして、結果をテキストボックスに格納する 42 var response = await client.GetAsync($"https://www.bing.com/search?{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}"); 43 44 htmlDocument.Text = response.ToString(); 45 } 46 } 47} 48

イメージ説明

投稿2021/04/28 12:49

kkokuke

総合スコア32

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

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

退会済みユーザー

退会済みユーザー

2021/04/29 03:09 編集

結局は GET 要求で、どういう要求が出て行っているか(クエリ文字列を含めてどういう URL を要求しているか)が分かればいいという話だったようですね。最初からそのように質問を書いてもらえていたらと思います。 それなら radian さんが回答された Fildder を使えばよかったはず。使い方が分からなくて諦めたようですが、例えば要求を Raw で見たら以下のようになっているはずです。 GET https://www.bing.com/search?q=C%23+HttpClient+post HTTP/1.1
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問