Статьи

Отладка HTTP с помощью Node и http-консоли

http-console — это Node-модуль, который предоставляет интерфейс командной строки для выполнения HTTP-команд. Он отлично подходит для отладки и точного отслеживания того, что происходит с вашими HTTP-запросами, независимо от того, были ли они направлены на веб-сервер, веб-службу или даже сервер базы данных.

Установка

Для использования http-консоли вам необходимо установить Node. Если он не установлен, либо зайдите на сайт http://nodejs.org и загрузите установщик для вашей операционной системы, либо перейдите на вики-сайт Node, если вы хотите установить его через менеджер пакетов .

Далее установите http-консоль с помощью npm :

$> npm install http-console2 -g 

Несколько вещей, чтобы отметить:

  • На самом деле мы устанавливаем http-console2 , а не http-console . http-console2 — это ветвь http-console, но содержит исправление для ошибки, вызванной устареванием require.paths в новых версиях Node. Он публикуется в npm как http-console2, но после установки вы все равно запускаете его как http-console.
  • Мы устанавливаем http-console2 с глобальным ключом -g . Это означает, что вы можете вызывать http-консоль из любой точки мира, так как она установлена ​​в вашей папке $PATH :

     $> type http-console http-console is /usr/local/bin/http-console 

Чтобы начать использовать http-консоль, мы просто передаем ему URL и порт того, к чему мы хотим подключиться, и начинаем выдавать команды HTTP.

Говоря HTTP

Давайте подключимся к серверу и выдадим несколько команд. Начнем с простых вещей и выполним некоторые GET запросы к веб-серверу. Я предполагаю, что, когда вы читаете это, вы веб-разработчик. И, как веб-разработчик, вы, вероятно, имеете веб-сервер, работающий по адресу http: // localhost . Скажите http-console, чтобы подключиться к нему, набрав следующее:

 $> http-console http://localhost > http-console 0.6.1 > Welcome, enter .help if you're lost. > Connecting to localhost on port 80. 

Теперь, когда вы подключены, вы можете начать давать команды. Введите GET / в командной строке:

 http://localhost:80/> GET / HTTP/1.1 200 OK Server: nginx/1.0.11 Date: Wed, 04 Jan 2012 08:40:04 GMT Content-Type: text/html Content-Length: 151 Last-Modified: Mon, 04 Oct 2004 15:04:06 GMT Connection: keep-alive Accept-Ranges: bytes <html> <head> <title>Welcome to nginx!</title> </head> <body bgcolor="white" text="black"> <center><h1>Welcome to nginx!</h1></center> </body> </html> 

Мы получаем полный ответ HTTP, включая заголовки HTTP и сам HTML. Вы можете выйти из http-консоли, набрав .q

Давайте попробуем другую команду. Недавно я написал о экспресс-веб-фреймворке для Node , мы создали страницу для отображения десяти последних твитов с упоминанием Sitepoint. Интересно, что произойдет, если мы будем использовать http-console для запроса API поиска в Twitter на похожие твиты?

 $> http-console http://search.twitter.com > http-console 0.6.1 > Welcome, enter .help if you're lost. > Connecting to search.twitter.com on port 80. 

Теперь выполните запрос GET для /search.json?q=sitepoint&rpp=10 :

 http://search.twitter.com:80/> GET /search.json?q=sitepoint&rpp=10 HTTP/1.1 200 OK Cache-Control: max-age=15, must-revalidate, max-age=300 Expires: Fri, 17 Feb 2012 22:04:02 GMT Content-Type: application/json;charset=utf-8 Content-Length: 7749 Vary: Accept-Encoding Date: Fri, 17 Feb 2012 21:59:02 GMT X-Varnish: 2065334673 Age: 0 Via: 1.1 varnish Server: tfe { page: 1, since_id: 0, max_id_str: '170628259464216576', refresh_url: '?since_id=170628259464216576&q=sitepoint', completed_in: 0.107, results: [ { to_user_id_str: null, to_user_name: null, id: 170628259464216580, iso_language_code: 'en', ... 

Опять же, мы возвращаем HTTP-заголовки, но на этот раз мы получаем тело HTTP-ответа в виде JSON (полный JSON опускается для экономии места).

Но мы не ограничены подключением к веб-серверам и веб-сервисам через http-консоль. Мы также можем использовать его для подключения к серверам баз данных, которые предлагают RESTful API, например, CouchDB . (Если у вас не установлен CouchDB, самый простой способ начать работу — это клонировать https://github.com/iriscouch/build-couchdb и следовать инструкциям в README.md).

Предполагая, что CouchDB работает (если вы установили через build-couchdb, запуск CouchDB должен быть таким же простым, как и запуск . ~/path/to/build-couchdb/build/env.sh , затем couchdb ), подключите к нему http-console следующим образом:

 $> http-console http://127.0.0.1:5984 > http-console 0.6.1 > Welcome, enter .help if you're lost. > Connecting to 127.0.0.1 on port 5984. 

Затем мы можем выдавать команды для базы данных. Давайте получим список всех баз данных:

 http://127.0.0.1:5984/> GET /_all_dbs HTTP/1.1 200 OK Server: CouchDB/1.1.1 (Erlang OTP/R15B) Date: Wed, 04 Jan 2012 08:26:18 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 25 Cache-Control: must-revalidate [ '_replicator', '_users' ] 

Как насчет создания новой базы данных?

 http://127.0.0.1:5984/> PUT /foodb ... HTTP/1.1 201 Created Server: CouchDB/1.1.1 (Erlang OTP/R15B) Location: http://127.0.0.1/foodb Date: Wed, 04 Jan 2012 09:19:05 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 12 Cache-Control: must-revalidate { ok: true } 

GET /_all_dbs команду GET /_all_dbs , и мы увидим нашу новую базу данных в списке:

 http://127.0.0.1:5984/> GET /_all_dbs HTTP/1.1 200 OK Server: CouchDB/1.1.1 (Erlang OTP/R15B) Date: Wed, 04 Jan 2012 09:19:18 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 33 Cache-Control: must-revalidate [ '_replicator', '_users', 'foodb' ] 

Теперь давайте добавим документ в foodb данных foodb . Нам нужно установить заголовок Content-Type на application/json , что легко сделать, .j команду .j (чтобы увидеть все доступные команды, введите .help в приглашении http-console):

 http://127.0.0.1:5984/> .j http://127.0.0.1:5984/> POST /foodb ... { "name":"foo", "body":"bar" } HTTP/1.1 201 Created Server: CouchDB/1.1.1 (Erlang OTP/R15B) Location: http://127.0.0.1/foodb/d4a833a173e9d22594b426fd300010a9 Date: Wed, 04 Jan 2012 09:36:30 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 95 Cache-Control: must-revalidate { ok: true, id: 'd4a833a173e9d22594b426fd300010a9', rev: '1-de4f3804f6f3d2d3a393bec924951e5a' } 

Мы можем выдавать HEAD запросы для получения информации о документах, DELETE запросы на удаление документов и DELETE запросы на удаление баз данных:

 http://127.0.0.1:5984/> HEAD /foodb/d4a833a173e9d22594b426fd300010a9 HTTP/1.1 200 OK Server: CouchDB/1.1.1 (Erlang OTP/R15B) Etag: "1-de4f3804f6f3d2d3a393bec924951e5a" Date: Wed, 04 Jan 2012 09:36:51 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 113 Cache-Control: must-revalidate http://127.0.0.1:5984/> DELETE /foodb/d4a833a173e9d22594b426fd300010a9?rev=1-de4f3804f6f3d2d3a393bec924951e5a HTTP/1.1 200 OK Server: CouchDB/1.1.1 (Erlang OTP/R15B) Etag: "2-3ac7397737175948b7a3a6b7e95d2949" Date: Wed, 04 Jan 2012 09:40:14 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 95 Cache-Control: must-revalidate { ok: true, id: 'd4a833a173e9d22594b426fd300010a9', rev: '2-3ac7397737175948b7a3a6b7e95d2949' } http://127.0.0.1:5984/> DELETE /foodb HTTP/1.1 200 OK Server: CouchDB/1.1.1 (Erlang OTP/R15B) Date: Wed, 04 Jan 2012 09:41:49 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 12 Cache-Control: must-revalidate { ok: true } 

Это был быстрый взгляд на использование http-консоли для создания и проверки HTTP-запросов. Мы сделали простые запросы GET к веб-серверу, сделали API-вызов к API поиска Twitter и дали команды серверу CouchDB. Конечно, YMMV, но, надеюсь, вы найдете это полезным дополнением к своему поясу инструментов веб-разработки.