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

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

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

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

POST

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3183閲覧

VBAのHTTP Requestで"Content-Type", "multipart/form-data"の時にテキストをPOSTするにはどうやったらいいでしょうか??

退会済みユーザー

退会済みユーザー

総合スコア0

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

POST

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/15 00:52

編集2021/05/15 00:54

タイトルの通り、ファイルをPOSTする文献は見つかるのですが、テキストをPOSTする方法が見つからず、Webの知識もなく、さっぱり分かりません。
どうしたらいいでしょうか?

curlやpythonだとこんな感じのコードになります

curl

1curl -F "800003=Dwight Schrute" \ 2 3 -F "800007=Partner" \ 4 5 -F "api=" \ 6 7 -H "Authorization:Basic YOUR_API_KEY_GOES_HERE" \ 8 9 https://www.ragic.com/demo/sales/1/3

python

1import requests 2 3headers = { 4 'Authorization': 'Basic YOUR_API_KEY_GOES_HERE', 5} 6 7files = { 8 '800003': (None, 'Dwight Schrute'), 9 '800007': (None, 'Partner'), 10 'api': (None, ''), 11} 12 13response = requests.post('https://www.ragic.com/demo/sales/1/3', headers=headers, files=files) 14

試したVBAコード

VBA

1`TargetはChangeイベントで返ってきたセルです 2`PostDataが実際にPOSTしたいテキストのkey=valueペアになります。 3 4 postData = """1000297=""" & Target.Value & "doFormula=true&doDefaultValue=true&doLinkLoad=true&api" 5 6 With httpReq 7 .Open "POST", "https://www.ragic.com/****/forms5/1/" & ragicID 8 Call .setRequestHeader("Authorization", "Basic THR*************==") 9 Call .setRequestHeader("Content-Type", "multipart/form-data") 10 .send (postData) 11' 12 Do While .readyState < 4 13 DoEvents 14 Loop 15 16 Debug.Print .Status 17 Debug.Print .responseText 18 End With

ステータスコードは200で、何も送ってない通信だけをするPOSTになり、「成功したよ!」レスポンスも返ってきますが、何も起こりません(Ragicはデータベースなのですが、1000297というIDがふられたfieldが更新されない)。

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

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

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

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

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

guest

回答3

0

Fiddler でも使って、curlやpythonと送ったリクエストの内容を比較してみては。

投稿2021/05/15 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

guest

0

ベストアンサー

postDataが異常な形式ですが、本当にそれが送りたいデータなら、コードはあってます。

データがおかしいのでは?

投稿2021/05/15 01:52

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2021/05/15 08:14

確認いただきありがとうございます。 トリプルクォテーションと、文字列の&がなかったですね。。。 試しに `"1000297=777788889999&doFormula=true&doDefaultValue=true&doLinkLoad=true&api"` とやってみたのですがうまくいきませんでした。 英語=true はクエリの条件で、 Pythonでは下記でPOSTが成功します。 ``` files={'1000297':(None,"777788889999"),#Intで""なしでも可 'doFormula':(None,'true'), 'doDefaultValue':(None,'true'), 'doLinkLoad':(None,'true'), 'api': (None,'')} ```
otn

2021/05/15 10:08

ファイルをポストするのじゃ無くてテキストをポストしたいという質問だったのでは? Pythonのコードはファイルのポストですが、質問と何か関係あるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/15 10:19

Call .setRequestHeader("Content-Type", "multipart/form-data") POSTにはこのContent Typeが指定されています。 本当にファイルの場合はこんな感じになるのですが、 fileName = 'demo01.xlsx' fileDataBinary = open(fileName, 'rb').read() files = {'uploadFile': (fileName, fileDataBinary, XLSX_MIMETYPE)} データベースなのでテキストになります。
退会済みユーザー

退会済みユーザー

2021/05/15 10:29

テキスト、というよりstringを、と言った方がニュアンス的に正確かもしれません。
otn

2021/05/15 11:57 編集

ファイルとしてポストするんだけど、ファイルのデータはファイルから読むんじゃなくてDBから読むと言うことですか? > ファイルをPOSTする文献は見つかるのですが、テキストをPOSTする方法が見つからず、 ファイルをPOSTする方法が分かっているなら、ファイルから読む部分をDBから読む処理に差し替えれば良いだけでしょう。
退会済みユーザー

退会済みユーザー

2021/05/15 12:02 編集

"Content-Type", "multipart/form-data" 自分の理解にが自信がないのですが、このタイプはファイルだけでなくテキストもポストできると理解しています。 POSTなのでファイルは読みません。 DBの各セルにポストしている感じなので、ファイルではなくテキストになるということです。 テキストのフォームとしてPOSTしている?というイメージになるのでしょうか。 HTMLではこんな感じのようです。 ``` <!-- Adding the parameter html means that api server returns html instead of default JSON --> <form action="https://www.ragic.com/start/petstore/1?html&api" method="POST"> <!-- Put down the field id as the parameter name for each field to map them to a field on the Ragic form --> <p>Item Id: <input type="text" name="1000001" /></p> <p>Item Name: <input type="text" name="1000003" /></p> <p>Item Price: <input type="text" name="1000005" /></p> <!-- Selections work the same way, just pass the selection value as parameter value --> <p>Item Category: <input type="radio" name="1000002" value="Dog" /> Dog <input type="radio" name="1000002" value="Cat" /> Cat </p> </form> ```
otn

2021/05/15 12:07

DBから読むんじゃなくて、Pythonプログラムと同じく、プログラム中に埋め込んだ文字列リテラルをファイルデータの代わりにファイルとしてPOSTすると言うことであれば、さっきのコメントは下記に訂正です。 > ファイルをPOSTする文献は見つかるのですが、テキストをPOSTする方法が見つからず、 ファイルをPOSTする方法が分かっているなら、ファイルから読む部分を文字列リテラルに差し替えれば良いだけでしょう。
otn

2021/05/15 13:30

今、上のコメントのHTMLの中を見ました。 それは Content-Type: application/x-www-form-urlencoded ですね。
退会済みユーザー

退会済みユーザー

2021/05/15 13:42

あ、その通りですね! すみません、元のAPI Docを読み間違えて勘違いしていました。
退会済みユーザー

退会済みユーザー

2021/05/15 13:44

そうするとByte型に変換してPOSTすればいいだけですね。
退会済みユーザー

退会済みユーザー

2021/05/15 13:52 編集

できました。ありがとうございます。自分一人では気づけなかったです。 エクセル好きの会社のみんなが喜びます。 これでDBのユーザー数もケチれます。 本当にありがとうございました。
guest

0

otnさんありがとうございました。

VBA

1postData = "1000297=" & Target.Value & "&doFormula=true&doDefaultValue=true&doLinkLoad=true&api" 2Dim bpostData() As Byte 3bpostData = StrConv(postData, vbFromUnicode) 4 5 With httpReq 6 .Open "POST", "https://www.ragic.com/****/forms5/1/" & ragicID 7 Call .setRequestHeader("Authorization", "Basic THR*************==") 8 Call .setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 9 .send (bpostData) 10' 11 Do While .readyState < 4 12 DoEvents 13 Loop 14 15 Debug.Print .Status 16 Debug.Print .responseText 17 End With

投稿2021/05/15 14:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問