SOFTELメモ

</> 技術者募集

【php】送信したリクエストの内容を見たい(2)

問題

APIを利用したプログラムを書いているとき、
APIに対してphpが送っているリクエスト内容を確認したいことがあります。

どうやるとよいでしょうか。

php

答え

プログラムが動いているサーバーにログイン可能であれば、tcpdumpで観察することが可能。

状況に応じてオプションは調整されたし。

# tcpdump -A host 相手先APIのIPアドレス

APIにリクエストを送る側 client.php

<?php

$url= 'APIのURL';
$xml='<?xml version="1.0" encoding="UTF-8" ?>
<books>
  <book>
    <title>APIの本</title>
    <price>1111</price>
  </book>
  <book>
    <title>PHPの本</title>
    <price>2222</price>
  </book>
</books>
';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$result = curl_exec($ch);

var_dump($result);

リクエストの中の Content-Type や、ファイル送信時のfilenameなど、普段見えないところまで見える。

# tcpdump -A host 160.16.121.151
(略)
).SD..I.POST / HTTP/1.1
Host: xxx.example.com
Accept: */*
Content-Type: text/xml
Content-Length: 201

<?xml version="1.0" encoding="UTF-8" ?>
<books>
  <book>
    <title>API......</title>
    <price>1111</price>
  </book>
  <book>
    <title>PHP......</title>
    <price>2222</price>
  </book>
</books>
(略)

特にAPIの開発となると、データが正しくても、リクエストヘッダなど細かな部分が影響して失敗していることがあり、いくら調べてもわからないときは、こうしてさらに深みに入っていって原因を探すこともあります。

例)
・Content-Type は application/x-www-form-urlencoded じゃなくて text/xml じゃないとダメ
・multipart/form-data でファイルをPOSTするけど、filename=~~の部分が影響していた。curl関数だとなぜかフルパスが入るが、ファイル名だけでないとダメ。

関連するメモ

コメント