REST Symfony2 + FOSRestバンドルでapiを開発しています。
「指定された形式」で応答を表示するために、ブラウザー(app_dev.php
ヘッダーに対応)から開発モード(Accept: text/html,application/xhtml+xml
)でAPIを呼び出す方法があるかどうか知りたい、symfonyが提供するプロファイラーでhtmlにラップされます。
これにより、ブラウザーでAPIへの呼び出しを直接デバッグできます。
編集:HTTPリクエストをデバッグしたくありませんが、プロセス全体(ルートマッチング、関連するDBクエリなど)をデバッグします。だからこそ、symfonyプロファイラーにアクセスしたいのです。
Symfony 2.4以降、プロファイラーはHTTPヘッダーにX-Debug-Token
とX-Debug-Token-Link
の2つの追加設定を設定します。 ( http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-api を参照)
これらのヘッダーには、トークンと、現在のリクエストのプロファイラーへの直接リンクが含まれています。プロファイラーが有効になっている場合は常に送信されます。
当然のことながら、これらのヘッダーの存在をチェックし、追加情報を提供するChromeで利用可能な拡張機能がすでにあります: Symfony2プロファイラーショートカット
私の意見では、これはカスタムhtmlラッパーよりも優れていますが、これはGETでのみ機能し、POSTリクエスト-PUTとDELETEリクエストは少しトリッキーです。そこでhttpクライアントを使用できます。 、chrome-extension [〜#〜] postman [〜#〜] のように、http-header X-Debug-Token-Link
で提供されるリンクを開いてプロファイラーを手動で開くか、プロファイラーページを保持します(fe http://example.org/_profiler/ )を開きました。
JSONまたはXML APIの開発時にWebDebugToolbarが表示されないのは、ツールバーがHTMLタイプの応答にのみ挿入されるように設定されているためです。
これを克服するには、JSONまたはXML応答をHTMLに変換するkernel.response
イベントリスナーをバンドルに追加します。
namespace Acme\APIBundle\Event\Listener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
class ConvertToHtmlResponse {
public function onKernelResponse(FilterResponseEvent $event) {
if (!$event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
// Only send back HTML if the requestor allows it
if (!$request->headers->has('Accept') || (false === strpos($request->headers->get('Accept'), 'text/html'))) {
return;
}
$response = $event->getResponse();
switch ($request->getRequestFormat()) {
case 'json':
$prettyprint_lang = 'js';
$content = json_encode(json_decode($response->getContent()), JSON_PRETTY_PRINT);
break;
case 'xml':
$prettyprint_lang = 'xml';
$content = $response->getContent();
break;
default:
return;
}
$response->setContent(
'<html><body>' .
'<pre class="prettyprint lang-' . $prettyprint_lang . '">' .
htmlspecialchars($content) .
'</pre>' .
'<script src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>' .
'</body></html>'
);
// Set the request type to HTML
$response->headers->set('Content-Type', 'text/html; charset=UTF-8');
$request->setRequestFormat('html');
// Overwrite the original response
$event->setResponse($response);
}
}
次に、バンドル内のリスナーをkernel.response
イベントに登録するだけです。これは、開発環境構成でのみ行うことをお勧めします。
services:
# ...
acme.listener.kernel.convert_html:
class: Acme\APIBundle\Event\Listener\ConvertToHtmlResponse
tags:
- { name: kernel.event_listener, event: kernel.response }
私はChrome拡張機能を使用しており、イベントリスナーを使用したくない場合はAPI開発中に非常に役立ちます(私にはうまくいきませんでした): https:// chrome。 google.com/webstore/detail/symfony2-profiler-shortcu/denlhphadllhcolhlbbbjmhkgbknmmon
別のブラウザーを開いて.../app_dev.php/_profiler /にアクセスするだけで、outeマッチングや関連するDBクエリなど、app_dev.phpに対して行われたすべてのリクエストを見つけることができます。
FOSRestBundleでは、特別なテンプレートを使用してデータをHTMLページに表示するため、デバッグツールバーを使用します。
注釈付きのコントローラー(対応するメソッドも使用します):
@View(template="AppBundle:Api:data.html.twig", templateVar="data")
そして、テンプレートで、好きなフォーマットを選択してください:
<body>
<pre>{{ data | serialize('json') }}</pre>
</body>
明らかにクイック&ダーティなソリューションですが、仕事をします。また、これらのルートに実際のHTMLページを表示する機能も制限されます。