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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2252閲覧

POST API C#

sosososo

総合スコア18

C#

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/08/06 08:25

編集2020/08/08 09:10

C# WindowsForms(.Net Framework 4.7)でネットショッピングサイトQoo10の操作ツールを制作しています。
その中でAPIを使用したやり取りを行うのですがよくわかりません。

http://api.qoo10.jp/GMKT.INC.Front.OpenApiService/APIList/Certification.api/CreateCertificationKey?user_id=string&pwd=string

上記の方法でURLにパラメータを付加してする方法はできていました。
ですが商品登録APIの際に商品説明文を送信するのですがそれをURLに直接付加するのは長すぎるのかなと思い他の方法を探しています。
ネット上にはJSONの方法はよく参考例としてあるのですがピンポイントで当てはまるようなものが無く。。。
APIのヘルプページにはPOST、GET、SOAPといった方法が使用できるとあり、「C# POST」で検索して半日ほどネット上の参考例をもとに試行錯誤していたのですが Server Error(500)しか出ず成功しません。

どの方式でも構いません。
どなたかC#でのAPI参考例を教えていただけないでしょうか?

<商品登録API ヘルプ>
http://api.qoo10.jp/GMKT.INC.Front.OpenApiService/APIList/guideindex.aspx

宜しくお願い致します。

追記
教えていただいたURLを参考に作成し試してみましたが同様の結果でした。

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Cache-Control: private Date: Sat, 08 Aug 2020 09:04:33 GMT Server: Microsoft-IIS/8.5 X-Powered-By: ASP.NET Content-Length: 35 Content-Type: text/plain; charset=utf-8 }}
public static bool SetNewGoods(RequestNewGoods clsRequest) { try { Dictionary<string, string> dictParam; dictParam = new Dictionary<string, string>(); dictParam.Add("key", clsRequest.key); dictParam.Add("SecondSubCat", clsRequest.SecondSubCat.ToString()); if (0 != clsRequest.BrandNo) { dictParam.Add("BrandNo", clsRequest.BrandNo.ToString()); } dictParam.Add("ItemTitle", clsRequest.ItemTitle); dictParam.Add("SellerCode", clsRequest.SellerCode); dictParam.Add("AudultYN", clsRequest.AudultYN); dictParam.Add("StandardImage", clsRequest.StandardImage); dictParam.Add("ItemDescription", clsRequest.ItemDescription); dictParam.Add("RetailPrice", 0.ToString()); dictParam.Add("ItemPrice", clsRequest.ItemPrice.ToString()); dictParam.Add("ItemQty", clsRequest.ItemQty.ToString()); dictParam.Add("ExpireDate", clsRequest.ExpireDate); dictParam.Add("ShippingNo", clsRequest.ShippingNo.ToString()); dictParam.Add("AvailableDateType", clsRequest.AvailableDateType.ToString()); dictParam.Add("AvailableDateValue", clsRequest.AvailableDateValue); HttpClient clsHttpClient; HttpResponseMessage clsResponceMsg; FormUrlEncodedContent clsContent; string strUrl; clsContent = new FormUrlEncodedContent(dictParam); strUrl = "http://api.qoo10.jp/GMKT.INC.Front.OpenApiService/GoodsBasicService.api/SetNewGoods"; clsHttpClient = new HttpClient(); clsResponceMsg = clsHttpClient.PostAsync(strUrl, clsContent).Result; return true; } catch (Exception ex) { return false; } }

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

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

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

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

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

dodox86

2020/08/06 08:30

C#での使い方ではありませんが、[新商品登録]の送信データ例にHTTPリクエスト例が載っています。 C#の該当のクラス、メソッドを用い、HTTPのPOSTメソッドを使ってSOAP(XML)で送るのです。
hihijiji

2020/08/06 08:50

SOAPならQoo10に WSDLくれって言ってみるのが早いかも
sosososo

2020/08/06 08:53

私はGET,POST,SOAPという通信方式があるのかと思っていたのですが、SOAPというのは通信の内容のごーマット的なものということでしょうか??
sosososo

2020/08/06 08:56

hihijijiさん 検索するとWSDLはSOAPの定義書と出てきたのですがその認識であっていますでしょうか? APIのガイドの情報のみでは厳しいということでしょうか??
hihijiji

2020/08/06 09:04

WSDLがあると Visual Studio の機能の「サービス参照の追加」で、自動的にコードが生成されます。 とっても楽なのでお勧めです。 もちろんAPIのガイドの情報が不足しているって言っているわけではありません。
dodox86

2020/08/06 16:19

ああ、失礼しました。API仕様を読むと、必ずしもSOAPで送信しなければいけない訳ではないのですね。GETであれば単なるURLクエリ文字列でよいはずですが、"ItemDescription"パラメータだとして、 ちゃんとURLエンコーディングされていない(URLとして適切な文字列になっていない)などがうまくいかない原因ではないでしょうか。 > GET /GMKT.INC.Front.OpenApiService/GoodsBasicService.api/SetNewGoods?SecondSubCat=string&ManufactureNo=string&BrandNo=string&ItemTitle=string&SellerCode=string&IndustrialCode=string&ProductionPlace=string&AudultYN=string&ContactTel=string&StandardImage=string&ItemDescription=string&AdditionalOption=string&ItemType=string&RetailPrice=string&ItemPrice=string&ItemQty=string&ExpireDate=string&ShippingNo=string&AvailableDateType=string&AvailableDateValue=string HTTP/1.1 Host: api.qoo10.jp GETでは長すぎる値は問題でるかもしれませんし、短い商品説明文字列("aaa"とか)でまずは試してみては。長い文字列ならPOSTで(Content-Type: application/x-www-form-urlencoded)、更にプログラム的に取り扱い易くするならSOAP、とのようになるのでしょう。
dameo

2020/08/07 02:02 編集

ちょっと資料を読んでみました。 [REST] GETの場合はリクエストボディがないので、クエリパラメータで展開する形になります。長過ぎると駄目でしょうね。 POSTの場合はリクエストボディでapplication/x-www-form-urlencodedになります。 いずれもHTMLのフォームデータと同じ形式で送る形になります。 本来のRESTではHTTPメソッドに意味がありますが、ここでは特にないようです。 レスポンスデータはSOAPと共通スキーマなXMLのようですね。 [SOAP](このサイトではRESTという認識でもあるらしい) POST一択で、リクエストボディでXMLを送ります。中身の定義もXMLで配布されており、WSDLと呼ばれます。 授受されるXMLデータはWSDLからオブジェクトとXMLを相互に変換するような仕組みを使ったり、直接XPathで走査したり、XSLTでHTMLにしたりします。 .NETの1.Xや2.0の頃はSOAPは廃れていなかったので、WSDLからソースコードを生成したりしていましたが、今その辺の仕組みがどうなっているか分かりません。 現在のページでは https://docs.microsoft.com/ja-jp/visualstudio/data-tools/how-to-add-update-or-remove-a-wcf-data-service-reference?view=vs-2019 この辺りかな? WSDLはAPIキーをもらったりするなら、そのときに恐らく知らされてると思いますが、多分↓な感じかと思います。 https://api.qoo10.sg/gmkt.inc.front.OpenApiService/[いろいろ].api?WSDL [いろいろ]な部分は各APIのURLから推測してください。
sosososo

2020/08/07 00:42

皆様返信が遅れて申し訳ございません。 hihijiji様  それは知らなかったです。。。そんな便利なものがあるとは。。。  現状の情報でも不足はないがあると便利ということですね!  回答ありがとうございます。
sosososo

2020/08/07 00:48

dodox86 様 回答ありがとうございます。 GETは自分で調べてみたりしてなんとなくわかったので他のAPIに関してはURLにクエリパラメータを付加して使用しています。 ですが商品登録APIには商品説明文という項目があり文字が長くなる可能性もあるので長さで問題になる可能性が高いのであれば使いたくないとなぁ。。。と思い別の方法を探しておりました。 POSTを利用しようと思ったのですが質問文の通り躓いてしまい、よい参考例や参考ページを御存知でしたら教えていただきたいです。
sosososo

2020/08/07 00:57

dameo 様 回答ありがとうございます。 なるほど。。。いろいろ試してみます!! APIキーはメールでのやり取りで発行してもらったのですが その際はキーのみが送られてきました。 このAPIガイドも再度問い合わせて教えてもらいました。
dodox86

2020/08/07 01:04

>@sosososoさん 私のコメントに限りませんが、ここは「質問への追記・修正の依頼」なので、回答ではないのですけれどもね。質問文を読む限り、検討、調査不足の部分があるか、「前提となる知識が足りないかもしれない」懸念があったので、皆さん、それらを補うべく助言をされています。助言からご自分で実際に試して解決するのであればそれはそれで良いことです。その場合は自己解決、回答で閉じてしまって良いと(少なくとも個人的には)思います。
sosososo

2020/08/08 09:17

dodox86 様 確認・返信が遅れて申し訳ございません。 >私のコメントに限りませんが、ここは「質問への追記・修正の依頼」なので、回答ではないのですけれどもね。 そうでした。失礼いたしました。 >「前提となる知識が足りないかもしれない」 おっしゃるとおりでしてWEB API等を使用したことがなく、今回ここに質問後調べてみてGET POST SOAP の違いをかんたんではありますが理解したほどです。
dameo

2020/08/08 09:56

一応WSDLからサービス参照を作ってSOAPでアクセスするコードのようなものを書いてみました。 using 指定した名前空間; ... var client = new GoodsBasicServiceSoapClient(); var cert = new GiosisCertificationHeader(); cert.Key = "[頂いたAPIキー]"; var response = client.SetNewGoods(cert, "", "", "", "", "", "", "", "", "", "", "", "", "", 0, 0, 0, "", 0, "", ""); APIキーももらってないし、サーバーに余計なエラーを吐かせるのもあれなので動かしてはいませんが、ビルドは通ります。向こうもWSDLをベースに作っているはずなので、こちらの方がミスも発生しにくいと思いますよ。ご参考までに。
dameo

2020/08/08 10:28

Channelを使った方がWCSの他のサービスとの親和性が高そうだし、現行コードとも相性が良さそうなので、それを使ったコードに変えてみました。 using 指定した名前空間; ... var factory = new ChannelFactory<GoodsBasicServiceSoapChannel>(); var channel = factory.CreateChannel(); var cert = new GiosisCertificationHeader(); cert.Key = "[頂いたAPIキー]"; var param = new SetNewGoodsRequest(); param.GiosisCertificationHeader = cert; param.SecondSubCat = ""; ... var response = channel.SetNewGoods(param);
guest

回答2

0

商品登録APIの際に商品説明文を送信するのですがそれをURLに直接付加するのは長すぎるのかなと思い他の方法を探しています。

であれば POST 送信するという選択になると思います。API 資料の「HTTP POST」を見るとデータは application/x-www-form-urlencoded 形式にするということのようです。

HttpClient を使ってデータを application/x-www-form-urlencoded 形式で POST 送信する例を紹介しておきます。以下の記事の button1_Click メソッドのコードを見てください。

HttpClient で ASP.NET Web API にアクセス
http://surferonwww.info/BlogEngine/post/2019/09/29/call-aspnet-web-api-from-httpclien.aspx

元々は ASP.NET Web API にアクセスするためのサンプルですが、認証に必要なユーザー情報は application/x-www-form-urlencoded 形式で POST 送信しており、それが button1_Click メソッドのコードです。

application/x-www-form-urlencoded 形式なので ASCII 文字以外はパーセントエンコーディングが必要ですが、それを自動的にやってくれたかどうかは記憶にないです。質問者さんの方で確認してください。

他に SOAP を使う方法がありますが、プロキシクラスなしでは難しいと思います。

Visual Studio のツールを使ってプロキシクラスを生成できますので、それが可能か Qoo10 に聞いてみてはいかがですか?

ローカル .wsdl ファイルからプロキシ作成
http://surferonwww.info/BlogEngine/post/2020/05/11/generate-proxy-class-from-local-wsdl-file.aspx

プロキシクラスを生成できれば、後はそれを使って以下のようにアクセスできます。

WCF サービスの非同期呼び出し
http://surferonwww.info/BlogEngine/post/2018/02/28/call-wcf-service-method-asynchronously.aspx

投稿2020/08/07 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dameo

2020/08/07 02:08

自分の運営サイトだけでなく、Microsoftのページをベースに紹介しないと宣伝として通報対象になりかねませんよ。Microsoftのページをメインに出しつつ、サンプルとしてこんなのも…とさり気なく紹介する形がいいかと思います。
退会済みユーザー

退会済みユーザー

2020/08/07 02:13

余計なお世話
dameo

2020/08/07 02:50

スパムライクにSEO目的で利用する人もいるので、ランキング入りした常連さんは模範として気をつけましょう
gentaro

2020/08/07 05:52

そんなもん内容次第でしょ。 無関係なサイトに誘導しているならともかく、参考に紹介することの何が悪いのか。 ここで同じ内容を1から書けとでも言うんだろうか。 通報対象だと思うなら変な持論を展開するより先に通報すりゃいい。
dameo

2020/08/07 06:30

@gantaro 「自分の運営サイトだけでなく、Microsoftのページをベースに紹介しないと」と言ってるだけですよ 「Microsoftのページをメインに出しつつ、サンプルとしてこんなのも…とさり気なく紹介する形がいい」と言っています。 正直に言えばSurferOnWwwさんのサイトに私は移動していません。 少なくとも私にとって、この回答には情報としての価値がないのです。 正しいことを言っていると確信ができて、内容が具体的に分かっていて興味があれば移動するかもしれません。 そのための最低条件が「MSへの正しいリンクを示すこと」になります。 それで足りない部分があるなら、どういう目的なのか明確にした上で他人のサイトなり自分のサイトなりを紹介すればいいでしょう。 私と同じような人がどれくらいいるかは分かりませんが、不特定多数の回答者がSurferOnWwwさんのような行動をしたとしたら、日本語の技術情報検索結果はますます混迷を極めると思いますよ。 質問者そっちのけのコメントはマナー違反だと思うので、この話はここまでで。
gentaro

2020/08/07 06:40

調べりゃすぐ出てくるMSのサイトを何故を出さないといけないのか意味不明。 調べるための手がかりが回答に含まれてりゃそれでいいでしょ。 質問者そっちのけのオレオレルールの主張を初めておいて、勝手に打ち切るのもどうなの。 回答の価値は質問者が決めりゃ良いし、あなたが本当に無価値だと思うならリンク先含めて精査して問題点を指摘して低評価をした上で回答の価値の向上に貢献すりゃいいじゃん。 やってることがただのクレーマーだよ。
Zuishin

2020/08/07 06:49

> 不特定多数の回答者がSurferOnWwwさんのような行動をしたとしたら、日本語の技術情報検索結果はますます混迷を極めると思いますよ。 リンク先が間違ってたら低評価とコメントしていってください。間違いが無くて回答に必要な情報ならいいんじゃないでしょうか。 公式情報は信頼度が高いし、それをリンクする事で回答の信頼度も高くなるので、公式情報をリンクするよう心がけることは大変良いことだと思います。 しかし、他の情報は全て信頼度皆無かというと、そんなことはないんじゃないでしょうか。 嘘を嘘と見抜けない初心者であればあるほど SEO とデザインだけ優秀な粗悪な情報に踊らされやすいので、可能な限り公式に頼るのがいいと思いますが、公式だけに依存していたのでは足りないのも確かです。 自分で情報を集め、実際にコードを書いて裏をとったものを紹介するのは特に問題とは思いません。もしそれが間違っていたら他の会員がチェックしましょう。
dameo

2020/08/07 07:03 編集

これ以上こちらを無関係な話で汚すわけにはいかないので、discordにアカウントを作りました(dameo#8719)。 以降はこちらにフレンドを飛ばした上でお願いします。明日(8/8)午前0時までは基本承諾しますよ。 それ以降はログインしないかも…
Zuishin

2020/08/07 07:08

それよりもこの問題の是非について teratail タグで質問したらどうでしょうか。teratail の使用者全員に関係する問題だと思いますし、ここでわざわざ書いたということは、その考えを啓蒙したいという思いがあってのことでしょう。他の場所にもっていくのは違うと思います。
dameo

2020/08/07 07:17

それこそリソースの無駄遣いだと思います。 discordでまともな議論が出来て、誰かが有益だと判断したならサマリをまとめて意見を問うくらいはしてもいいのではないでしょうか。あと時間は日本時間午前0時ですよ。もう8時間ないからご注意を。
Zuishin

2020/08/07 07:21

では私が質問しましょうか?リソースの無駄遣いだとは思いませんし、もしそれが無駄なら啓蒙する意味もなく、ここでの dameo さんのコメントそのものが無駄ということになってしまいます。 私が質問した場合、回答通知は私に来ますし、私がベストアンサーを選ぶことになりますが、それでも構いませんか?
dameo

2020/08/07 07:32

今がすでに無駄遣いだと思います。議論した結果のサマリもない状態で公開質問を始める意味が分かりません。勝手に質問するのを止める権利は私にはありませんが、サマリもない状態で方向性を決めないままいきなり公開質問しても、一部だけの意見でまとまるか、議論が発散するかの二択だと思うので、リソースの無駄遣いとしか思えません。 何にせよマナー違反だと思うので、以降私が必要と思わない限り発言しません。
Zuishin

2020/08/07 07:46

であれば、dameo さんは自分の最初の発言こそがリソースの無駄遣いであり、マナー違反であると言っていることになりますよ。
gentaro

2020/08/07 07:56 編集

「汚すわけには云々」って逃げてるけど、公に議論できない事情があるんですか? そもそも最初のコメントに正当性があると思ってるのなら、広告勧誘行為は明確な規約違反なんだから運営に通報して沙汰を待てば済む話なのに、なぜそうしないのか意味不明なんですが。 私は運営がこの回答を広告だと解釈するとは思ってませんけど。
Zuishin

2020/08/07 08:07

一応、争点のサマリを置いておきます。 - 回答では公式情報をリンクすべきであり、その他のリンクは公式情報を補足する参考情報とすべきである - 特に自分のブログをリンクするのは広告であり、規約違反であるとみなされ、通報の対象となる - ランカーは他のユーザーの模範となるため、上記行動を慎むべきである
dameo

2020/08/07 15:03

discordのフレ申請許可は終了しました。 申請者は予想通りゼロ。 議論をしたい人はおらず、コメントを汚したい人だけだったという結果です。
gentaro

2020/08/07 16:20

話の起点も終点もオレオレルール。 これで社会で生きていけるならある意味羨ましいわ。周りの人すげー迷惑だろうけど。
Zuishin

2020/08/07 21:51

なぜそんなに議論したいのか理解に苦しみます。あなたの考えたあなたのルールについて興味などありませんし、議論の必要性を感じません。 あなたがそれを啓蒙したいなら、teratail で行うべきでしょうし、そうでないなら黙って二度とリソースの無駄遣いをするな。それだけです。
sosososo

2020/08/08 09:05

SurferOnWww 様 返信・確認が遅れて申し訳ございません。 大変参考になりました。 休日はQoo10は対応してくれないので現段階ではSOAPは諦めてPOSTで行こうと思います。 ネットを参考に色々試してみていたので回答内URLページ同様のものを既に試していたようです。 回答頂いたURLを参考に作り直しましたが同様の結果でした。 コードを追記しておきますので問題点等あれば教えていただきたいです。
退会済みユーザー

退会済みユーザー

2020/08/08 09:30

Fiddler などのキャプチャツールを使って要求ヘッダとボディが API の仕様通りになっているか調べてください。
sosososo

2020/08/08 10:08

ありがとうございます。 やってみます!
sosososo

2020/08/08 10:31

Fiddlerで確認したところパラメーター不足の文字があったので全パラメーターを追加し不要なところは空で送信したところ成功しました!!! ありがとうございます!!
guest

0

自己解決

FiddlerというソフトをSurferOnWww様から教えていただき確認したところ
パラメータ不足と書いてあったので全パラメータを追加し不要なところは空で
送信すると成功しました。

皆様ご迷惑をおかけしました。
回答ありがとうございました。

public static bool SetNewGoods(RequestNewGoods clsRequest) { try { Dictionary<string, string> dictParam; dictParam = new Dictionary<string, string>(); dictParam.Add("key", clsRequest.key); dictParam.Add("SecondSubCat", clsRequest.SecondSubCat.ToString()); dictParam.Add("BrandNo", clsRequest.BrandNo.ToString()); dictParam.Add("ManufactureNo", 41278.ToString()); dictParam.Add("ItemTitle", clsRequest.ItemTitle); dictParam.Add("SellerCode", clsRequest.SellerCode); dictParam.Add("IndustrialCode", ""); dictParam.Add("ProductionPlace", ""); dictParam.Add("ContactTel", ""); dictParam.Add("AudultYN", clsRequest.AudultYN); dictParam.Add("StandardImage", clsRequest.StandardImage); dictParam.Add("ItemDescription", clsRequest.ItemDescription); dictParam.Add("AdditionalOption", ""); dictParam.Add("ItemType", ""); dictParam.Add("RetailPrice", 0.ToString()); dictParam.Add("ItemPrice", clsRequest.ItemPrice.ToString()); dictParam.Add("ItemQty", clsRequest.ItemQty.ToString()); dictParam.Add("ExpireDate", clsRequest.ExpireDate); dictParam.Add("ShippingNo", clsRequest.ShippingNo.ToString()); dictParam.Add("AvailableDateType", clsRequest.AvailableDateType.ToString()); dictParam.Add("AvailableDateValue", clsRequest.AvailableDateValue); HttpClient clsHttpClient; HttpResponseMessage clsResponceMsg; FormUrlEncodedContent clsContent; string strUrl; clsContent = new FormUrlEncodedContent(dictParam); strUrl = "http://api.qoo10.jp/GMKT.INC.Front.OpenApiService/GoodsBasicService.api/SetNewGoods"; clsHttpClient = new HttpClient(); clsResponceMsg = clsHttpClient.PostAsync(strUrl, clsContent).Result; return true; } catch (Exception ex) { return false; } }

投稿2020/08/08 10:36

編集2020/08/08 10:37
sosososo

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問