前提・実現したいこと
Access VBAでxmlをPOSTし、java側で受け取るという処理があります。
発生している問題・エラーメッセージ
Window 10のPCでAccess VBAを動かした場合に、
パラメータ(下記ソースのpostXML)がうまく送られず、
java側で受け取ったときに空文字になっています。
エラーメッセージは特に出ていません。
該当のソースコード
Public Function HttpPOST(strURL As String, postXML As String) As String
Dim objHttp As Object
Dim objDoc As Object
Dim resXML As String
Dim strErrMsg As String
On Error GoTo HttpPOST_Err
HttpPOST = vbNullString
Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
With objHttp
'タイムアウトの設定
.setTimeouts 30000, 30000, 30000, 30000
'定型句
.Open "POST", strURL, False
.SetRequestHeader "Content-Type", "application/xml; charset=""Shift_JIS"""
'Shift-JISにしてPOST
.send (ChangeChr(postXML))
'接続NGの場合Exit
If .Status <> 200 Then GoTo HttpPOST_Err
'取得内容をユニコードに変換
resXML = StrConv(.responseBody, vbUnicode)
Debug.Print resXML
HttpPOST = resXML
End With
Set objHttp = Nothing
Exit Function
〜〜途中のソースは省略〜〜
Public Function ChangeChr(strXML As String) As Byte()
Dim objSTREAM As Object
On Error Resume Next
Set objSTREAM = CreateObject("ADODB.Stream")
With objSTREAM
.Open
.Type = adTypeText
.Charset = "Shift_JIS"
.WriteText strXML
.Position = 0
.Type = adTypeBinary
.Position = 0
ChangeChr = .Read()
End With
objSTREAM.Close: Set objSTREAM = Nothing
End Function
試したこと
課題に対してアプローチしたことを記載してください
送信しているパラメータ(ChangeChr(postXML))には、
問題なく値が設定されていることは確認できています。
また、java側ではパラメータ空文字になってしまっていますが、
受信自体は出来ています。
また、以下を試しています。
・CreateObject("MSXML2.ServerXMLHTTP")の修正
CreateObject("MSXML2.ServerXMLHTTP.3.0")や、
CreateObject("MSXML2.ServerXMLHTTP.6.0")に
変更して動かしてみましたが、改善しませんでした。
・SetRequestHeaderの修正
"Content-Type", "application/xml; charset=""utf-8"""や、
"Content-Type", "application/x-www-form-urlencoded; charset=""Shift_JIS"""に
変更して動かしてみましたが、改善しませんでした。
↓4/26追記
WireSharkにて確認した、パケットキャプチャの結果を載せておきます。
(一部変更し伏せています)
Win7で実行した場合は、一番下のContent-Lengthが0ではなく、 正しい数値(268)が入っています。
POST /api/httpApiXmlMessageReceive HTTP/1.1
Connection: Keep-Alive
Content-Type: application/xml; charset="Shift_JIS"
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 268
Host: XX.XXX.XXX.XXX
<?xml version="1.0" encoding="Shift_JIS" ?>
~xmlの中身は省略~
</sps-api-request>HTTP/1.1 302 Found
Date: Tue, 26 Apr 2016 03:29:54 GMT
Location: http://XX.XXX.XXX.XXX
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain
POST /api/httpApiXmlMessageReceive/ HTTP/1.1
Connection: Keep-Alive
Accept: */*
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 0
Host: XX.XXX.XXX.XXX
補足情報(言語/FW/ツール等のバージョンなど)
VBA 7.0を使用
Windows7のPCでは問題なく動いており、Windows10では使っている
どのPCでも発生しています。
ただ、WIndows10に原因があるのかどうかはわかっていません。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
すみません、こちら解決しました。
VBAの方に記述してあるAPI先のURLが一部不足しており、リダイレクトされていたことが原因でした。
回答頂いた方、ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
てきとうですが…
Accessを再インストールしたら?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
自分のところで動いているExcelVBAのPOSTサンプルです。受け側はphpです。
多分ヘッダのenctypeはapplication/x-www-form-urlencodedかmultipart/form-dataじゃないと
ダメなんじゃないかなーと思います。
あと自分でリクエスト生成する場合、paramStrはvariantじゃないとダメだとどこかで見ました。
参考になるといいですね。
'------------------------------------------------------------------------
Private Sub openPostQuery(url As String, paramStr As String)
'-----------------
'リクエスト生成
'-----------------
'--------------
'POST実行
'--------------
Dim xmlhttp As Object
Set xmlhttp = CreateObject("msxml2.xmlhttp")
xmlhttp.Open "POST", url, False 'オープン
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send (paramStr) 'パラメータ送付
'--------------
'応答取得
'--------------
Dim retCd As String
retCd = xmlhttp.Status '結果コード取得
If retCd <> 200 Then
Debug.Print "error:" & retCd
Else
Dim retHtml As String
retHtml = StrConv(xmlhttp.responsebody, vbUnicode, 1041) '結果HTML取得
Debug.Print retHtml
End If
End Sub
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
試しにですが
Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
を
Set objHttp = CreateObject("MSXML2.XMLHTTP")
に変えてみてやってみるといかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
eripong
2016/04/18 10:44
Wiresharkなどでパケットキャプチャして、どのようなリクエストが送られているか確認できますか?
morio12
2016/04/18 17:07
Wiresharkを使ったことがないため、やるにしても時間が掛かりそうです。
どうしても原因がわからない場合に、確認してみようと思います。
kaz.Suenaga
2016/04/18 19:50 編集
問題が発生するPCでそのAccessを開き、VBEからデバッグをした際にエラーはでませんか。
また、インストールされているAccessは32bit版ですか、64bit版ですか。
morio12
2016/04/18 20:26
VBAのデバックをしても、特にエラーは出ておりません。
また、インストールされているAccessは32bit版です。
PCは、Windows10もWindows7も共に64bit版です。
kaz.Suenaga
2016/04/18 20:58
`.send (ChangeChr(postXML))` の前の行に
Debug.Print ChangeChr(postXML) を入れた結果は確認されていますか。
morio12
2016/04/18 21:07
上記のソースは入れておりませんが、デバックしてウォッチ式で見た結果は、
問題なく動作しているときのものと変わっておりません。
バイト型の配列が入っています。
eripong
2016/04/18 22:13
Java側のコードはどうなっていますか?ちなみに、こちらの環境ではAccessがないので、Windows10、Excel 2013で提示されたコードを実行してみましたが、サーバで送信したXMLをrequest.getInputStream()したものを標準出力に書き出すことで確認できました。
morio12
2016/04/19 09:53
request.getInputStream()で出力しています。
デバックで確認すると、requestのbody部に何も入っていないという状態です。
kaz.Suenaga
2016/04/19 12:00
そもそもですが、Win7 と Win10 の置かれている環境(特にネットワークセグメント)は同一のものでしょうか。
morio12
2016/04/19 12:30
はい、置かれている環境は同一です。
morio12
2016/04/26 00:54
遅くなりましたが、Wiresharkでパケットキャプチャをしたところ、正しいパラメータが確認できました。
クライアントでリクエストを送っているときは問題なく、サーバ側の問題ということになるのでしょうか?
eripong
2016/04/26 10:16
正しいかどうかは、うまく動いているwindows7からのリクエストも見て比較した方が良いと思いますが、本当に正しいのなら、クライアントマシンは正しく送信できているということと考えて良いと思います。
eripong
2016/04/26 10:17
サーバとの間にはネットワークもあると思うので、ネットワークの問題の可能性もあると思います。
morio12
2016/04/26 12:41
回答ありがとうございます。
パケットキャプチャの結果を載せておきます。
(一部変更し伏せています)
Win7で実行した場合は、一番下のContent-Lengthが0ではなく、
正しい数値(268)が入っています。
Connection: Keep-Alive
Content-Type: application/xml; charset="Shift_JIS"
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 268
Host: XX.XXX.XXX.XXX
<?xml version="1.0" encoding="Shift_JIS" ?>
~xmlの中身は省略~
</sps-api-request>HTTP/1.1 302 Found
Date: Tue, 26 Apr 2016 03:29:54 GMT
Location: http://XX.XXX.XXX.XXX
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain
POST /api/httpApiXmlMessageReceive/ HTTP/1.1
Connection: Keep-Alive
Accept: */*
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 0
Host: XX.XXX.XXX.XXX
~以降、省略~
morio12
2016/04/26 12:43
記載し忘れましたが、Win7とWin10の端末は同じ場所に置いてあるため、ネットワークの問題ではないと思います。
eripong
2016/04/26 14:11
改行がないと分かりにくいので、質問に追記できませんか?POSTかGETか分かる様にしていただくとありがたいです。それから、最初のリクエストがリダイレクトされてる様に見えますが、Windows7でもこの動きですか?
morio12
2016/04/26 14:24
失礼しました。
質問に追記しました。
リダイレクトについては、Windows7でも同様です。