Как отправить запрос GET с вводом json с помощью скамьи apache?

Запрос на нашу услугу выглядит примерно так:

GET http://[SERVICE]/Node:[id].Build?format=mime1,mime2,...,mimeN&template-id=[templateid]
Accept: multipart/mixed
Content-Type: application/json
body: json document

Я пытаюсь использовать ApacheBench для тестирования эталонного теста. Вот вызов, который я использую:

ab -n 10 -c 2 -T 'application/json' -H 'Accept: multipart/mixed' 'http://phx5qa01c-02b0.stratus.phx.qa.ebay.com/.Build?format=text/html,text/plain&template-id=29b1468f-c8c3-db23-2f6f-74e112795540'

Этот вызов проходит и приводит к ошибке, поскольку ожидаемых данных json нет. Есть ли способ в ab предоставить необходимый json вместе с этим запросом. Я вижу, что есть команды -p и -u для указания входного файла, но они предназначены для размещения и публикации.


person Mike Gostintsev    schedule 21.06.2013    source источник
comment
Я задаюсь вопросом, почему вы используете метод GET для отправки данных в первую очередь. Хотя это технически не запрещено, маловероятно, что ваш вариант использования не нарушает требования RFC 2616 по безопасности и идемпотентности. Используете ли вы документ JSON в качестве замены строки запроса, чтобы сделать сложный запрос из ресурса? Поделитесь своей мотивацией для этого.   -  person rdlowrey    schedule 23.06.2013
comment
Причина, по которой мы это делаем, заключается в том, что нам нужно передать много переменных, чтобы точно указать, что нужно получить. Мы рассматривали возможность использования их в качестве параметров запроса, но использование json имело больше смысла. Мы не отправляем данные как таковые, просто отправляем критерии/переменные, которые описывают, что нам нужно. Есть ли способ сделать это с помощью ab?   -  person Mike Gostintsev    schedule 24.06.2013
comment
Ах я вижу. Это имеет смысл, хотя я бы все же предложил упростить API, чтобы предоставлять конкретные адресуемые параметры через строку запроса URI. Например, вместо предоставления массивного механизма запросов из одного монолитного ресурса разбейте его на подресурсы для запросов к определенным типам ресурсов. Я почти уверен, что с ab это невозможно сделать, и тому есть довольно веская причина: HTTP работает хорошо, потому что он стандартизирован. Создание собственной схемы запроса через тело GET излишне усложняет ситуацию и, как правило, не рекомендуется.   -  person rdlowrey    schedule 24.06.2013
comment
Имеет смысл, спасибо за вклад.   -  person Mike Gostintsev    schedule 25.06.2013


Ответы (1)


Я понимаю, что этот ответ опоздал на шесть лет, но я думаю, что его стоит опубликовать, так как я бился головой о стену по очень похожей проблеме, в которой я пытался загрузить тестовый URL-адрес, который возвращал только данные JSON, и мое решение может помочь другим читателям, столкнувшимся с этой проблемой. Моя проблема заключалась в том, что я продолжал указывать параметр -H, когда мне это не нужно. Это продолжало заставлять сервер отправлять код ответа HTTP 406 (неприемлемо) на мой запрос AB. Во время большей части устранения неполадок я также сохранял -T 'application/json' в запросе AB, когда он мне не нужен. Это используется только в сочетании с PUT или POST (при использовании ключа -p). Поэтому я удалил -H и -T, и это сработало. Все, что сказал, я вижу эти две проблемы здесь. Мы должны помнить, что AB по умолчанию использует метод GET.

  1. Вы ограничиваете AB, добавляя к запросу дополнительные настраиваемые заголовки, используя параметр -H: -H 'Accept: multipart/mixed', который может заставить ваш целевой сервер подумать, что это недопустимый запрос, и тут же остановить последовательность. Просто не используйте -H, если у вас нет действительно веской причины.

  2. Вы используете параметр -T: -T 'application/json', который работает только в том случае, если вы укажете это в сочетании с -p, и у вас нет -p нигде в вашей команде, которую вы все равно не хотите использовать, поскольку вы отправляете GET и не PUT или POST.

Поэтому, чтобы исправить это, просто удалите обе опции -T и -H, и все должно работать. Напоминание другим читателям: в Windows заключите URL-адрес в двойные кавычки, если он содержит специальные символы, такие как "&" или "?", как в этом случае.

ab -n 10 -c 2 'http://phx5qa01c-02b0.stratus.phx.qa.ebay.com/.Build?format=text/html,text/plain&template-id=29b1468f-c8c3-db23-2f6f-74e112795540'
person T-Heron    schedule 22.09.2019