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

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

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

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

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

API

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

4127閲覧

web api通信で、こちらが送信したヘッダだけが受信側で取得できない(データは取得できる)

akiras

総合スコア8

HttpWebRequest

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

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

API

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/07/16 04:54

編集2019/07/16 08:29

概要

・他者とAPIで送受信しています(つまり送る方と受け取る方)
・APIの構築はこちらがvb.net、先方はJava
・データはJSONでの送受信
・客先での連携テストなので、デバック環境は乏しい

問題

・こちらからのAPI送信が、先方でエラーになっている
・原因はヘッダが取得できないためとのこと
・ヘッダが無く、データのみが送信されているとのこと
・開発中は簡易コントローラーでヘッダ、データ(JSON)が取得できることを確認済
・先方発信APIの場合、こちらのコントローラーではヘッダ、データを正しく取得できている

試したこと

・再度開発環境でヘッダ、データ(JSON)の取得を確認(ただあくまでもIISの世界)
・以前にご教授いただいた『Fiddler』で調査

Fiddlerで調査

1.先方からこちらのコントローラーへのリクエスト(先方はPostmanで代用)
・結果は正しくヘッダ、データが取得できている
Inspectors>Headersで期待した値を確認

  取得したヘッダの値(期待通り)
Entity       Content-Type: application/json 
Miscellaneous   XXX-RId : 2019-07-16-001 ※実際のキー、値は異なります

2.こちらから先方へのリクエスト(先方はこちらで作ったvb.netの簡易コントローラーで代用)
・期待したヘッダ、データがFiddlerでは取得できていない
※但し、visual stadioのデバックでは簡易コントローラーでヘッダ、データが取得できている

  取得したヘッダの値(期待した結果ではない)
Entity       Content-Type: application/x-www-form-urlencoded 
Miscellaneous   セットしたヘッダ無し

   ※データも取得できていない 


ソース(エラーになっている送信API)

ソース

Public Class restApi100        ・        ・        ・ '文字コードを指定する Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") Dim result As String Using stream As New IO.MemoryStream '--- シリアライズ Dim serializer As New DataContractJsonSerializer(json.GetType) serializer.WriteObject(stream, json) '--- 結果を取得 result = System.Text.Encoding.UTF8.GetString(stream.ToArray()) End Using 'バイト型配列に変換 Dim postDataBytes As Byte() = enc.GetBytes(result) '--- 日本語も変換できた 'HttpWebRequestの作成 Dim req As HttpWebRequest = CType(HttpWebRequest.Create(pmsUrl), HttpWebRequest) ' 暗黙変換できなかったのでCTypeでキャスト req.Method = "POST" ' Method req.ContentType = "application/json; charset=utf-8" ' ※header1 req.Headers.Add("XXX-RId", "2019-07-16-001") ' ※header2 req.ContentLength = postDataBytes.Length ' ContentLength 'データをPOST送信するためのStreamを取得 Dim reqStream As System.IO.Stream = req.GetRequestStream() '送信するデータを書き込む reqStream.Write(postDataBytes, 0, postDataBytes.Length) reqStream.Close() 'サーバーからの応答を受信するためのWebResponseを取得 Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse) '※※※ ここでリクエスト実行  ※※※ '応答データを受信するためのStreamを取得 Dim resStream As System.IO.Stream = res.GetResponseStream()              ・              ・              ・ ```              ## ソース(受信側) ※これが簡易コントローラー ```              Public Class restApi500 '-------------------------------------------------------------------- ' 簡易コントローラー '-------------------------------------------------------------------- <OperationContract(), WebInvoke()> Public Function report(req As List(Of RequestJsonItem)) As ResponseJsonClass Dim RequestHeaders = WebOperationContext.Current.IncomingRequest.Headers ' リクエストヘッダー Dim strConType As String = RequestHeaders("Content-Type") '--- "application/json; charset=utf-8" Dim strXXX-RId As String = RequestHeaders("XXX-RId")             '--- "2019-07-16-001" ・ ・ ・ ※デバックだとヘッダが取得できている ```              --------------------------------------------------------------------------- ## 確認 Q1. リクエスト実行時、Fiddlerにヘッダやデータが正しく取得できていないということは こちらの送信APIに問題があるのでしょうか? もしくはこちらのAPサーバーやIISの設定等に問題があるのでしょうか? そしてヘッダだけなぜ渡らないのでしょうか? Q2. こちら側が問題の場合、対処法はどのようにすればいいのかご教授願います

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/07/16 05:28

ソースは ``` と ``` で囲ってください。インデントされて見やすくなりますので。インデントされてないコードは質問者さん自身も見る気が起きないのでは? 自分のような第三者はなおさらです。
CHERRY

2019/07/16 05:47 編集

Fiddler は、中継したパケットをキャプチャーしているだけですので、Fiddler を正しく使っているのに パケットがキャプチャーされないということは、送信したデータが Fiddler を通過していないことが考えられます。 通信先のホストへ正しく接続できていますか? たとえば、接続先への接続中にエラーが出ていたりしないですか?
akiras

2019/07/16 06:02

SurferOnWww様 ソースを整えました、ご確認ください。
akiras

2019/07/16 06:05

CHERRY様 visual stadioで簡易コントローラー(vb.net)を作って確認しているのですが ヘッダ、データともに期待通りの値が取得できます。
退会済みユーザー

退会済みユーザー

2019/07/16 06:37 編集

> ソースを整えました、ご確認ください。 直ってません。ソースコード(コメント含む)の一行目の上に ``` を、最後の行の下に ``` を入れるのですよ。
akiras

2019/07/16 06:40

SurferOnWww様 すいません、詳細な解説ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/07/16 06:41

> visual stadioで簡易コントローラー(vb.net)を作って確認しているのですがヘッダ、データともに期待通りの値が取得できます。 とのことですが、質問本文には、 > 2.こちらから先方へのリクエスト(先方はこちらで作ったvb.netの簡易コントローラーで代用) ・期待したヘッダ、データが取得できていない とあります。どっちが正しいのでしょう?
退会済みユーザー

退会済みユーザー

2019/07/16 06:48 編集

インデントしていただいたコード > req.**ContentType** = "**application/json; charset=utf-8**" > req.Headers.Add("**XXX-RId**", "2019-07-16-001") の ** は実際には無いのですよね。であれば、質問に書いてある > 取得したヘッダの値(期待した結果ではない) > Entity       Content-Type: application/x-www-form-urlencoded  > Miscellaneous   セットしたヘッダ無し ということはどう考えてもなさそうですが、どういうことでしょう? CHERRY さんへのレスにあった、 > visual stadioで簡易コントローラー(vb.net)を作って確認しているのですがヘッダ、データともに期待通りの値が取得できます。 が正しいということですか?
CHERRY

2019/07/16 07:20

> visual stadioで簡易コントローラー(vb.net)を作って確認しているのですが > ヘッダ、データともに期待通りの値が取得できます。 うーん? 更に状況がわからなくなってきた... 途中経路のネットワークに問題はないのかという点を確認したかったのですが・・・ 「こちらから先方へのリクエスト(先方はこちらで作ったvb.netの簡易コントローラーで代用)・期待したヘッダ、データが取得できていない」環境と 「簡易コントローラーで、受信できている」環境は、同じものですか? たとえば、受信できないのが「送信自社LANのホストから客先のネットワークにあるホスト間で送受信」で、受信に成功している環境は、「自社LANの送信ホストから同一LAN上の簡易コントローラーで送受信」のように テストしている環境の差は無いのでしょうか?
akiras

2019/07/16 08:00

SurferOnWww様 >とあります。どっちが正しいのでしょう? わかりづらくてすいません Fiddlerでは取得できないのですいが、visual stadioのデバックでは簡易コントローラーでヘッダ、データが取得できています。
akiras

2019/07/16 08:06

CHERRY様 先に同じで、visual stadioのデバックでは簡易コントローラーにヘッダ、データが取得できていますが その結果をFiddlerで確認すると、ヘッダ、データともにNGなのです。
退会済みユーザー

退会済みユーザー

2019/07/16 08:07

その「簡易コントローラー」というのは一体何なのですか? 「Fiddler で取得できない」というのは具体的にどういう状況なのかもわかりません。もう、ホントに何が何だか分かりません。
akiras

2019/07/16 08:40 編集

SurferOnWww様 度々すいません、簡易コントローラーとは本来であれば先方のAPIへ送信するのですが、デバック環境では存在しないのでこちらで作った仮想送り先apiを簡易コントローラーと言ってます。 ちなみにPostmanで直接簡易コントローラー(http://localhost/vvvvv/restApi500.svc/report)を指定して実行、Fiddlerで確認したらRequestヘッダが意図した結果となりました。  ・Content-Type: application/json  ・XXX-RId : 2019-07-16-001 ※やはり送信プログラムに問題があるのでしょうか・・・
退会済みユーザー

退会済みユーザー

2019/07/16 09:04 編集

もう絶対に話がおかしいと言うか、きちんと状況が伝えられていない気がしています。 現在のアプリで相手先の API に接続して要求をかけたときの Fiddler でのキャプチャは取れないのですか? それをベースに話をしないとこの先いくらやっても話が通じなさそうです。
akiras

2019/07/16 09:31

SurferOnWww様 >現在のアプリで相手先の API に接続して要求をかけたときの Fiddler でのキャプチャは取れないのですか? ・相手先との連携テストができるのは客先だけで、客先ではFiddler等のツールは使用不可なのです ・相手先からは『ログを解析した結果、こちらで送ったヘッダ情報が取得できない』と言われています ・よって持帰って私の開発環境でいろいろテストしてます ・私の環境では相手先のシステムがないので『簡易コントローラー』を作り、そこで調査しています ※客先でのFiddler使用等、対処を考えます  内容がうまく伝えられずすいません、も少し自分でもがいてみます
t_obara

2019/07/16 09:48

デバッグ環境でも良いので、貴殿が送信しているAPIリクエストをパケットキャプチャし、そのrawデータ(API関連部分)を提示されてはいかがでしょうか。また、相手先にデバッグ環境はないのですか?そこで貴殿のデバッグ環境を動作させ、キャプチャなどして確認いただいてはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/17 00:57 編集

情報のやり取りが、相手先 ⇔ 質問者さん ⇔ ここの回答者とダブルホップになっているのですね。シングルホップ(質問者さん ⇔ ここの回答者)でもなかなか話が通じないのに、ダブルホップでは情報が伝わらなくて解決は難しそうですね。 > 客先でのFiddler使用等、対処を考えます 是非そうしてください。Fiddler で、実際の環境でクライアントを相手先 API に接続して、目に見える情報(キャプチャ結果・・・特に不具合を指摘されている要求ヘッダ)を取得してください。 それをベースに話をするのがベストと思いますが、とりあえず以下を教えていただけますか? > ・相手先からは『ログを解析した結果、こちらで送ったヘッダ情報が取得できない』と言われています それは質問者さんが自分の目で見た確認したわけではなくて、相手先からそう言われたという話と理解しています。 それで、相手先は具体的にどういう状況だと言っているのですか? 最初の質問に書いてあった下記の状況だと言っているのですか? 違うのであれば、どう違うのか教えてください。 > 取得したヘッダの値(期待した結果ではない) > Entity       Content-Type: application/x-www-form-urlencoded  > Miscellaneous   セットしたヘッダ無し 上記はログを見た結果ということで、それ以上の詳しい話は不明と想像しています。しかし、もし、相手先がどのように試して、何を見てそう言っているのか詳しいことが分かれば教えてください。 > ・私の環境では相手先のシステムがないので『簡易コントローラー』を作り、そこで調査しています その「簡易コントローラー」で相手先と同じ条件になるのでなければ意味が無いと思うのですが、そこのところはいかがですか?
akiras

2019/07/17 05:19

t_obara様 キャプチャしようとしたところ、ひとつ勘違いに気が付きました 私の環境でうまくいかないと言ってましたが、見ていたのは送信前(画面)のURLでした。 実行ボタンクリック後に出力したそれかと思っていましたが、自分(つまり送信前画面)のURLを見ていました。 仕様  ・実行ボタンクリックでアクション開始  ・送信前の画面では検索条件を特定して、バッチプログラムに情報を渡します  ・バッチプログラムで情報収集しJSON形式にして相手先(簡易コントローラー)へリクエストする   ※上記の場合、Fiddlerではキャプチャできていないようです(簡易コントローラーのURLがでてこないので)バッチプログラムが間に入るとキャプチャできないのでしょうか? ' バッチプログラムの呼出しサンプル Dim DwnldBat As New SS1234BT() Dim DwnldThread As New Threading.Thread(New Threading.ThreadStart(AddressOf DwnldBat.Main)) '受け渡し情報 With DwnldBat .strKaisiDT = dt.ToString("yyyy/MM/dd HH:mm:ss") .strUserID = Session("UserId").ToString .Path = Request.MapPath(Request.ApplicationPath & "/download") End With DwnldThread.Start() '--- バッチプログラムの起動 Postmanで相手先(簡易コントローラー)へリクエストすると、そのURLがFiddlerに出力します そしてヘッダもデータ(JSON)も期待したとおり表示しています >また、相手先にデバッグ環境はないのですか?そこで貴殿のデバッグ環境を動作させ、キャプチャなどして確認いただいてはいかがでしょうか。  再度提案してみます
akiras

2019/07/17 07:21

SurferOnWww様 >それは質問者さんが自分の目で見た確認したわけではなくて、相手先からそう言われたという話と理解しています。  察しの通りログは確認していません、相手先から言われた内容です。 >それで、相手先は具体的にどういう状況だと言っているのですか? 最初の質問に書いてあった下記の状況だと言っているのですか? 違うのであれば、どう違うのか教えてください。  まぎらわしくて申し訳ありません、Content-Type: application/x-www-form-urlencodedやセットしたヘッダが無いといってるのは私の環境でテストした結果です  ※1つ前で書きましたが、私がFiddlerで見た場所が間違っていました   具体的には送信前画面のURLを見ていたので、ヘッダやデータがなくてあたりまえでした...   Postmanで実行するとFiddlerで『簡易コントローラー』がキャプチャできるのですが、システム(つまり今回の要因)だと、バッチ経由がいけないのか   Fiddlerでキャプチャできません  相手先からメールがきたので一部修正して載せます   ・現在、原因不明ですが、冒頭Content-TypeやXXX-RId等が存在しません。   ・相手先が想定している電文    "Content-Type":"application/json:charset=utf-8",    XXX-RId:"2019-07-17",    [      {--中身省略--},      {--中身省略--},      {--中身省略--}    ]  ・実際に受信した電文(つまりこちらからのリクエスト)    [     {--中身省略--},{--中身省略--},{--中身省略--}    ]   ※これを見ると、ヘッダ情報はJSONの先頭にセットしなければいけないのでしょうかね?    ここを確認します >その「簡易コントローラー」で相手先と同じ条件になるのでなければ意味が無いと思うのですが、そこのところはいかがですか?  条件は異なります、ほんとうは同一条件がもちろんいいのですが  現状、相手先と同じ条件では時間的な問題もあって作れません  今は相手からの調査結果待ちとなっています。
t_obara

2019/07/17 08:45

パケットキャプチャは、IPパケットをキャプチャするものです。例えばhttps://qiita.com/567000/items/265a69b51025a1fcf90a Fiddlerは上位レイヤのキャプチャアプリですよね。下位レイヤデータを見た方が原因を究明しすい場合もあります。
退会済みユーザー

退会済みユーザー

2019/07/17 11:00 編集

> 相手先からメールがきたので一部修正して載せます その内容を見ましたが、はっきり言わせてもらえると、相手方の言うことも質問者さんの言うことも信頼に足りません。 質問では以下のコードが書かれていました。 req.ContentType = "application/json; charset=utf-8" req.Headers.Add("XXX-RId", "2019-07-16-001") これに間違いなければ、送信ヘッダには以下が含まれるはずです。 Content-Type: application/json; charset=utf-8 XXX-RId: 2019-07-16-001 なのに、相手先が言うにはそれらは含まれなくて、以下しかなかったとのことなのですよね。 [{--中身省略--},{--中身省略--},{--中身省略--}] そんなことはあり得ないじゃないですか。質問者さんがアップされたコードにはそんなものは見当たりませんし。 相手方、質問者さんのどちらか、または両方が間違ったことを言っているとしか思えません。 上にも書きましたが、情報のやり取りが、相手先 ⇔ 質問者さん ⇔ ここの回答者とダブルホップになっている状況で、相手先 ⇔ 質問者さんの間の話など知る由もありません。 実際の環境で Fiddler を使ってキャプチャして、まずは相手先 ⇔ 質問者さんの間でその結果を見てよく話し合ってください。 ここの回答者に話を持ってくるのはその後です。
akiras

2019/07/18 00:58

t_obara様 情報ありがとうございます、後で試してみます。
akiras

2019/07/18 01:08

SurferOnWww様 相手先からの情報で、受信方法に問題があることが確認されましたとのことです。 とりあえず対応待ちとなりました。 >ここの回答者に話を持ってくるのはその後です。  おっしゃるとおりです、お騒がせしました。  相手先の対応で解決できるかわかりませんがとりあえず対応待ちとなりました。  情報の信憑性に欠けた事をお詫びいたします。
退会済みユーザー

退会済みユーザー

2019/07/18 01:29

想像ですが、相手先 ⇔ 質問者さんの間で話が通じてないように思います。 相手方は要求ヘッダとコンテンツの区別がついてないのでは? 要するに、失礼を承知で言わせていただけると、スキルレベルが低くて話が通じてないのでは? 相手先が言うには、以下しかなかったとのことですが、それは要求ヘッダではなく送信したコンテンツではないですか? [{--中身省略--},{--中身省略--},{--中身省略--}] 即ち、質問にあったコードで言うと以下で送信した JSON 文字列では? reqStream.Write(postDataBytes, 0, postDataBytes.Length) ヘッダとコンテンツの話がゴッチャになっていて、話が通じてないとしか思えないです。
退会済みユーザー

退会済みユーザー

2019/07/18 01:41 編集

Fiddler 以外のキャプチャツールを使うという話が出ているようですが、HTTP 通信をキャプチャするなら Fiddler 一択です。 ただし、IE などのブラウザではない HttpWebRequest / HttpWebResponse や HttpClient を使ったアプリからアクセスする場合は相手が localhost の場合はダメです。 「直接簡易コントローラー」の url のホスト名は localhost なのですよね。 たぶん「直接簡易コントローラー」は質問者さんの開発マシンのローカル IIS で動いている ASP.NET でホストされている Web サービスか WCF ではないかと想像していますが、そうであれば IIS Manager でそれをサイトに設定して、設定したサイト名を hosts ファイルに登録し、アプリからは http://サイト名/... でアクセスすれば Fiddler でキャプチャできるはずです。実際自分はそうしています。
akiras

2019/07/18 02:33

SurferOnWww様 ヘッダの件  >相手方は要求ヘッダとコンテンツの区別がついてないのでは?   正直私にはわかりませんが、相手先のメールを見るともしかしたらというのはあります。   間に最低3社は入っているのでいろいろと面倒です。 Fiddlerの件  >「直接簡易コントローラー」の url のホスト名は localhost なのですよね。   察しのとおり、localhostです   あとで試してみます、ありがとうございます。
akiras

2019/07/24 00:15

SurferOnWww様、CHERRY様、t_obara様 返信遅くなりました、今週現地で疎通が通った確認がとれました。 やはりヘッダがbodyの先頭にある前提でプログラミングされていたようです 大変お騒がせしました ※Fiddlerがキャプチャしない件は、localhost以外でやってみたのですがNGでした  Postmanでは『localhost』でもキャプチャできるの理由がわかりません  疎通が通り、こちらの問題も発生したのでそれの対応におわれています  Fiddlerは後日また試してみます
退会済みユーザー

退会済みユーザー

2019/07/24 00:34 編集

ということは、質問者さんのコードは正しくて、結局現状のコードのままで解決したということですか? であれば、質問者さんの方で、回答欄に解決したということを書いて、それにマークをつけてこのスレッドはクローズしてください。 もし、Fiddler の件で質問を続けたいのであれば、新たに別スレッドを立てて質問するようお願いします。
akiras

2019/07/24 01:32

SurferOnWww様 >ということは、質問者さんのコードは正しくて、結局現状のコードのままで解決したということですか?     そうです・・・   失礼しました、回答欄を記載します。   ありがとうございました。
guest

回答1

0

自己解決

先方に問題があってそれを対応したら疎通できました。
※つまりヘッダ情報を取得できました

よってこちらはこの件では修正していません。
大変お騒がせしました。

投稿2019/07/24 01:34

akiras

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問