HTTP многочастный ответ с использованием Perl или PHP - PullRequest
9 голосов
/ 23 ноября 2011

Можно ли предоставить многокомпонентный ответ HTTP (используя Perl / PHP) так же, как многочастный запрос? Сценарий такой: я хотел бы предоставить URL, который принимает параметр для EmployeeID, а взамен ответ должен состоять из фотографии сотрудника, последнего платежного ведомости и информации, такой как имя, возраст и адрес. Принимающая сторона не является браузером, но это будет программа, которая получает этот ответ и обрабатывает его позже. Есть идеи, как это сделать?

Чтобы получить больше информации по моему вышеупомянутому вопросу, я должен предоставить URL моему другу, который будет программно получать ответ. Например, (в Perl):

$response = $ua->request($my_url)

Мое приложение должно отвечать не только данными, но и файлами! Меня попросили вернуть ответ из нескольких частей.

Я не знал, как начать с самого кодирования. Поиск в Google по «многочастному ответу» не дал страниц, с которыми я могу ознакомиться и начать работу. Тем не менее, комментарий Шансена был действительно полезным, а также его пример кода https://gist.github.com/1391017. Большое спасибо.

1 Ответ

8 голосов
/ 13 декабря 2011

Я представляю свой оригинал https://gist.github.com/1391017 в качестве ответа.

#!/usr/bin/perl
use strict;
use warnings;

use HTTP::Response;

my $response = HTTP::Response->new(
    200, 'OK', [ 'Content-Type' => 'multipart/form-data' ]
);

$response->protocol('HTTP/1.1');
$response->date(time);
$response->server('Foo/1.0');

my $name = HTTP::Message->new([
    'Content-Type'        => 'text/plain; charset=UTF-8',
    'Content-Disposition' => 'form-data; name="name"',
], 'John Doe');

$response->add_part($name);

my $note = HTTP::Message->new([
    'Content-Type'        => 'text/plain; charset=UTF-8',
    'Content-Disposition' => 'form-data; name="note"',
], <<'NOTE');
Resources:
  o http://search.cpan.org/dist/HTTP-Message/lib/HTTP/Message.pm
  o http://search.cpan.org/dist/HTTP-Message/lib/HTTP/Response.pm
  o http://tools.ietf.org/html/rfc2388
  o http://tools.ietf.org/html/rfc2616
NOTE

$response->add_part($note);

my $blob = HTTP::Message->new([
    'Content-Type'        => 'application/octet-stream',
    'Content-Disposition' => 'form-data; name="blob"; filename="blob.bin"',
]);
$blob->add_content('a chunk');
$blob->add_content(' of data');

$response->add_part($blob);

print $response->as_string;

Выход:

HTTP/1.1 200 OK
Date: Thu, 24 Nov 2011 10:03:25 GMT
Server: Foo/1.0
Content-Type: multipart/form-data; boundary=xYzZY

--xYzZY
Content-Type: text/plain; charset=UTF-8
Content-Disposition: form-data; name="name"

John Doe
--xYzZY
Content-Type: text/plain; charset=UTF-8
Content-Disposition: form-data; name="note"

Resources:
  o http://search.cpan.org/dist/HTTP-Message/lib/HTTP/Message.pm
  o http://search.cpan.org/dist/HTTP-Message/lib/HTTP/Response.pm
  o http://tools.ietf.org/html/rfc2388
  o http://tools.ietf.org/html/rfc2616

--xYzZY
Content-Type: application/octet-stream
Content-Disposition: form-data; name="blob"; filename="blob.bin"

a chunk of data
--xYzZY--
...