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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

WPF

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

Q&A

1回答

1591閲覧

WPFを使ったWebAPIでPOSTしたJSON情報がWEB側のPHPを使ってデータベースにうまく追加できない

nguyenseiji

総合スコア156

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

WPF

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

0グッド

0クリップ

投稿2021/07/21 01:56

編集2021/07/21 02:05

お世話になっております。

WPFを使って情報をJSON形式でWeb側にPOSTしてそれをWEB側であるPHPを使って
Linuxのサーバー上にあるデータベース保存したいのですがうまくいかないです
挙動としてはINSERT自体は成功するのですが値がNULLになってしまいます

xaml

1 <Button Content="Button" HorizontalAlignment="Left" Margin="58,42,0,0" VerticalAlignment="Top" Width="75" Click="btnApi_Click"/>

xaml.cs

1private async void btnApi_Click(object sender, RoutedEventArgs e) 2 3 { 4 5 var client = new HttpClient(); 6 var json = "{ \"age\" : 20, \"name\" : \"太郎\" }"; 7 var content = new StringContent(json, Encoding.UTF8, "application/json"); 8 var response = await client.PostAsync("http://localhost/jsonDebug.php/",content); 9 10 11 }

php

1<?php 2 3try{ 4 require "./private/database.php"; 5 $DBH->beginTransaction(); 6 7 8$url = $_SERVER['REQUEST_URI']; 9 10$json = $url; 11$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 12$arr = json_decode($json,true); 13$FirstIndex = $arr["age"]; 14$SecondIndex = $arr["name"]; 15 16$STMT = $DBH->prepare('INSERT INTO debug(Age,Name) VALUE(?,?)'); 17 $STMT->bindValue(1,$FirstIndex,PDO::PARAM_INT); 18 $STMT->bindValue(2,$SecondIndex,PDO::PARAM_STR); 19$STMT->execute(); 20 21 22 23 24 25 26$DBH->commit(); 27}catch(Exception $ERROR){ 28 $DBH->rollBack(); 29 print $ERROR; 30 exit(); 31} 32 33 34?>

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

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

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

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

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

m.ts10806

2021/07/21 02:01

PHP側の処理が提示されないままではなんとも言えませんし、タイトルと中身が合ってません。 APIなら「表示」という概念はありません。
nguyenseiji

2021/07/21 02:03

お世話になっております。 不足していたのに気ずきPHPのコード も追加させていただきました なおデーター接続部分は省略しております
m.ts10806

2021/07/21 02:42

渡されたJSONを受け取る処理がどこにもありませんね。 というかWebAPIならGETかPOSTでリクエストしないといけないのでは。 PHP側も何かしらのレスポンスは返さないとC#側で実行結果どうなったか受け取れないのでは。 設計どうなってます?
nguyenseiji

2021/07/21 02:56

PostAsync関数でPOSTリクエストしているという事ではないのでしょうか...
m.ts10806

2021/07/21 03:59

でもPHP側では何も受け取ってないですよね
nguyenseiji

2021/07/21 04:05

そうでうね... 例えばどういった感じでPHP側で受け取れるのでしょうか file_get_contents関数など色々試してみたのですがうまくいかず ぜひおすすめの参考サイトなどを教えていただけると幸いです
BluOxy

2021/07/21 05:58 編集

WPFアプリのことは考えず、まずはサーバー側(PHP)のPostリクエストに相当するURLをURLバーから手打ちで入力してみて、データベースにデータが追加されることを確認してみてはどうでしょうか。 また、そもそも設計がよくわかりませんでした。WPFのクライアントがいて、PHPを埋め込んだHTMLのページとPHPのサーバーがあって、WPFのクライアントがPHPを埋め込んだHTMLのページのURLをリクエストしている(?)ように見えますが、もしそうであれば直接PHPのサーバーにリクエストを送れば良いのではないかと思いました。
nguyenseiji

2021/07/21 06:03

ご返信のほう、ありがとうございます。 PHPを少し改造してPHP単体でデーターベースに追加できるか確認したところ 問題なく成功しました やりたい事としてはWPFクライアント側で入力したIDに基づきPOSTでPHP(サーバー)側にリクエスト したIDをPHPが処理してそのIDの情報だけSELECTした情報をWPFのクライアントに返してあげたいです
BluOxy

2021/07/21 06:42

参考にしているページやドキュメントなどはあるでしょうか。もしあれば記載していただきたいです。 もし無ければご自身の力でもう少し調べてもらうか、調べ方が分からない旨を質問に記載しましょう。
guest

回答1

0

.NET クライアントから Web API を呼び出す (C#) を参考にしてください。
今回の質問に限らず、新規で開発する際は出来るだけ信頼できる情報源を見つけて読むようにしましょう。
C# 関連であればまずは上記のような Microsoft のページを探してみましょう。

C#

1private static readonly HttpClient _client = new HttpClient(); 2private static readonly string _serverUrl = "http://localhost/jsonDebug.php/"; 3 4private static async Task<User> CreateUserAsync(User user) 5{ 6 var response = await _client.PostAsJsonAsync(_serverUrl, user); 7 response.EnsureSuccessStatusCode(); 8 return await response.Content.ReadAsAsync<User>(); 9} 10 11private async void btnApi_Click(object sender, RoutedEventArgs e) 12{ 13 var provisional = new User() { Age = 20, Name = "太郎" }; 14 var created = await CreateUserAsync(provisional); 15 //TODO: write any codes 16}

Swagger Codegen を使った方法も紹介しておきます。
Swagger/OpenAPI を使用する ASP.NET Core Web API のドキュメント
Swagger / OpenAPI 定義から C# クライアントを自動生成するツールの比較
【連載】ASP.NET Web API を使おう:第3回 swagger-codegenでクライアントコードを生成する

Swagger Codegen は色々な言語で実装された Web API サーバーのスタブを色々な言語向けに生成してくれます。
(特定の言語に依存しない)
今回なら PHP で実装されたサーバーのスタブを C# クライアントのコード(dll)として生成して利用できます。

C#

1private static readonly string _serverUrl = "http://localhost/jsonDebug.php/"; 2 3private async void btnApi_Click(object sender, RoutedEventArgs e) 4{ 5 // User, UserApi class is automatically generated by Swagger Codegen 6 var userApi = new UserApi(_serverUrl); 7 var user = await userApi.PostUserAsync(20, "太郎"); 8 //TODO: write any codes 9}

Swagger Codegen に限らず、Swagger を利用すると例えば Swagger UI から API のテストができたり、ドキュメントを自動生成してくれたり、Swagger Codegen から上記のようなスタブを言語に依存せず生成できたりするので、開発の規模や内容によっては開発効率が上がるかもしれません。

投稿2021/07/21 07:11

編集2021/07/31 02:09
BluOxy

総合スコア2663

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

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

nguyenseiji

2021/07/21 08:00

回答ありがとうございます。 マイクロソフト公式のドキュメントは見やすいですね もう少し解読してみようと思います 頂きましたコードなのですが これはヒントをいただけたという事でしょうか? エラー CS0246 型または名前空間の名前 'User' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください) と出てくるのですがこれはusingを何か指定するという事でしょうか
BluOxy

2021/07/21 08:06 編集

上記のドキュメントを見ると Product クラスを(Json文字列にシリアライズした上で)Postリクエストを送っていると読めますね。つまり、Microsoftで紹介されているコードは、Product クラスの定義が必要ということです。 今回の回答に載せたコードも同じです。クラスが定義されていなければ自分でクラスを定義する必要があります。定義の仕方はProductクラスを参考にしてください。
BluOxy

2021/07/21 08:40 編集

書いたコードは自分がドキュメントを参考にした結果の産物です。クラスの定義自体はあまり重要ではなく、ドキュメントを見て分かる内容だったので回答では省きました。 大事なのはドキュメントを読んで理解することで、そこさえ出来れば想定しているコードは書けると思います。 ドキュメントが難しく感じたり読めなかったりするときは、恐らく文章の意味を理解したつもりでいたけれど実は理解していなかったり、どこか学ぶべき手順を飛ばしていたりする可能性があります。 うまくドキュメントに向き合えるようになるとドキュメントを見て分かる情報を質問せずに済み、コードを書く力も一気に向上します。この回答で最も伝えたいことはそういうことです。 ゆっくりでいいので、読んでみてください。
BluOxy

2021/07/21 09:01 編集

余談ですが、見やすいドキュメントに解読は必要ないのではないでしょうか。 (例えば、ドイツ語を知らない私がドイツ語の文書を見てもそれを見やすいとは思いません) 分からない単語や概念は、そのドキュメントだけを見ても知りようがないでしょうから、 Google で1つずつ調べてみてください。その工程を過ぎれば、初めてそのドキュメントを読むことができ、見やすいか否かの判断をすることができます。 (例えば、ドイツ語の単語や文法を学ばないとドイツ語の文書は読めません)
nguyenseiji

2021/07/24 00:47

ありがとうございます。 もう少し調べてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問