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

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

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

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

1回答

4395閲覧

PowerShellのInvoke-RestMethodの-bodyの連想配列がうまくつながらない問題について

kokesi

総合スコア5

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/11/12 16:21

編集2019/11/12 17:49

powershellでInvoke-RestMethodの-Bodyがうまくいかずに困っています。

現状のコードがないので、例えを作りますと

これ①と
$uri = "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?"
$body=@{
appId="715cb5c68601e9a6646dbb57c71aff1b178e9637"
lang="J"
statsDataId="0003214725"
metaGetFlg="Y"
cntGetFlg="N"
cdTime="2017000000"
}

$response = Invoke-RestMethod -Uri $uri -Body $body -method GEt

これ②は
$uri = "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?appId=715cb5c68601e9a6646dbb57c71aff1b178e9637&lang=J&statsDataId=0003214725&metaGetFlg=Y&cntGetFlg=N&cdTime=2017000000"

$response = Invoke-RestMethod -Uri $uri -method GEt

同じものになるはずなのですが,①のみうまく入りません。
本来は使っているAPIも違うのですが、どうぞお分かりの方は教えていただけますでしょうか。

追記①のサーバに送られているのを見ますと
http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData

http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?appId=715cb5c68601e9a6646dbb57c71aff1b178e9637&lang=J&statsDataId=0003214725&metaGetFlg=Y&cntGetFlg=N&cdTime=2017000000

このようにbodyの内容がuriに結びつかないのが問題になります。

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

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

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

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

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

guest

回答1

0

①のやり方でも、フォームのパラメータの並びは変更されますが②と同じで、GETメソッドで正しく送られています。

CMD

1C> type post1.ps1 2# $uri = "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?" 3$uri = "http://localhost:8000/rest/2.0/app/json/getStatsData?" 4$body=@{ 5appId="715cb5c68601e9a6646dbb57c71aff1b178e9637" 6lang="J" 7statsDataId="0003214725" 8metaGetFlg="Y" 9cntGetFlg="N" 10cdTime="2017000000" 11} 12 13$response = Invoke-RestMethod -Uri $uri -Body $body -method GET 14 15C> powershell -NoProfile -ExecutionPolicy unrestricted .\post1.ps1 16

受信(サーバー側)

sh

1$ nc -l 8000 2GET /rest/2.0/app/json/getStatsData?lang=J&cdTime=2017000000&statsDataId=0003214725&metaGetFlg=Y&appId=715cb5c68601e9a6646dbb57c71aff1b178e9637&cntGetFlg=N HTTP/1.1 3User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; ja-JP) WindowsPowerShell/5.1.18362.145 4Host: localhost:8000 5Connection: Keep-Alive 6

①と②の例をよくよく見ると、フォームパラメータの内①はappId、②はappIDとなっていて、文字列自体が異なります。サーバー側で大文字小文字を区別しているのでうまく動かない、ということはありませんか。

尚、こちらで確認したのはWindows 10上で、PowerShellのバージョンは以下、です。

PowerShell

1PS C:> $PSVersionTable 2 3Name Value 4---- ----- 5PSVersion 5.1.18362.145 6PSEdition Desktop 7PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} 8BuildVersion 10.0.18362.145 9CLRVersion 4.0.30319.42000 10WSManStackVersion 3.0 11PSRemotingProtocolVersion 2.3 12SerializationVersion 1.1.0.1

投稿2019/11/12 17:14

dodox86

総合スコア9183

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

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

kokesi

2019/11/12 17:52

回答いただきありがとうございます。appIdの記述を変更してもうまくいしませんでした。 また、本文に追記いたしましたので、よろしければご確認ください。
dodox86

2019/11/12 23:39 編集

補足のコメントを拝見しましたが、「GETリクエストで送られてはいるものの、クエリー文字列部分が欠落している」か、「なぜかPOSTメソッドで送られてしまって、コンテントボディにパラメータがセットされてしまっている」かのどちらかだと思います。 質問者さんの実行環境はどのようなものですか? WindowsのバージョンやPowerShellのバージョンをご明示ください。Invoke-RestMethodのリファレンスを見ると、-Body オプションに値をセットすると、"GET"メソッドでもクエリー文字列部分にセットされて使われるように記述があります。そして、現に私が試した場合でもそのようになりました。(回答のまま) https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-5.1 質問者さんのケースでは、Invoke-RestMethodが私の環境とは同じように動作していないのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問