13

(Следующее предыстория, вы можете перейти к «Вопрос:», если хотите)

Есть веб-страница для одного из моих курсов, которая принимает входной текст (ожидается, что это код Python), а затем дает некоторый токенизированный ответ. Он предназначен для использования в качестве ссылки для лексеров Python, которые мы пишем. Я пытаюсь автоматизировать процесс тестирования и проверять мой код, не открывая браузер, не копируя текст туда-сюда и т.д. Итак, вот что я пытаюсь сделать:

У меня есть пример файла Python с именем «x.py», и я хочу отправить его на сервер, как если бы я заполнил эту форму. Я пробовал:

curl --data-urlencode "file=@x.py" http://matt.might.net/apps/pylex/pylex.php

Но, к сожалению, это не работает правильно, потому что очевидно, что "@x.py" публикуется как содержимое моего файла (то есть "file=@x.py" - это то, что публикуется, а не "file=<contents-of-x.py>"). Я пробовал --form и --data но они тоже не сработали.

Вопрос: В частности, если у меня есть файл с содержимым, не закодированным в URL, и содержимое этого файла должно быть частью процедуры POST и связано с определенным именем (в данном случае, file), каков правильный способ выполнения этот?

2 ответа2

22

То, что вы хотите, это "file@x.py" (нет =).

Из справочной страницы curl:

name @ filename Это заставит curl загружать данные из данного файла (включая любые новые строки), URL-кодировать эти данные и передавать их в POST. К части имени добавляется знак равенства, в результате чего name = urlencoded-file-content. Обратите внимание, что имя должно быть уже закодировано в URL.

1

Я оставлю ответ qmega как принятый, но я также оставлю ответ, который оставил в комментарии, для удобства чтения. Еще один способ сделать это - просто указать "file=`cat x.py`" . Для полной команды это будет:

curl --data-urlencode "file=`cat x.py`" http://matt.might.net/apps/pylex/pylex.php

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .