perl многочастный запрос с использованием REST :: Client - PullRequest
1 голос
/ 24 апреля 2020

Я использую Perl REST :: Client для создания многочастного POST-запроса:

#! /usr/bin/perl

use REST::Client;
use JSON;

$file = 'output.csv';
$headers = {'Content-Type' => 'multipart/form-data', 'Authorization' => 'Bearer '.$token.''}; 
$client = REST::Client->new(); 
$req = '{"sessionId" => '.$sessionId.' , "content" => ["file" => ['.$file.']]}';
$client->setHost(<host>); 

$client->POST( '/api/test',$req, $headers);
$response = from_json($client->responseContent());

REST API выглядит следующим образом:

@PostMapping("/test")
@Timed
public Response<Map<String, Object>> test(@RequestParam("file") MultipartFile file,
        @RequestParam("sessionId") Long sessionId,
        HttpServletRequest request) throws URISyntaxException {
}

при запуске Сценарий получает следующую ошибку:

Не удалось проанализировать многочастный запрос сервлета; вложенное исключение: java .io.IOException: org. apache .tomcat.util.http.fileupload.FileUploadException: запрос был отклонен, так как не было найдено многочастной границы]

Я новый с perl, что-то не так с синтаксисом или чем-то еще?

1 Ответ

2 голосов
/ 25 апреля 2020

REST :: Client ожидает от вас создания всего тела сообщения, а вы этого не делаете. В самом деле, вы не должны пытаться сделать запрос вручную (или даже JSON). Из вашего кода я подозреваю, что на самом деле вы не должны делать многокомпонентный запрос, но мне нужно посмотреть документы API, чтобы что-то сказать об этом.

Вот аналогичная задача в Mojo: : UserAgent . Вместо того, чтобы пытаться создать тело сообщения, я делаю запрос со структурой данных, которую вычисляет Mojo:

use Mojo::UserAgent;
use v5.10;

my $ua = Mojo::UserAgent->new;

my $url ='http://httpbin.org/post';
my $session_id = 'deadbeef';
my $filename = 'upload_file.csv';

my $tx = $ua->post(
    $url,
    form => {
        session => $session_id,
        some_file => {
            file => $filename,
            },
        },
);


say "Request:\n", $tx->req->to_string;

say "Response:\n", $tx->result->to_string;

Отправка этого на httpbin - это удобный способ проверить вещи. Вывод показывает, что заголовок и составные элементы происходят автоматически:

Request:
POST /post HTTP/1.1
User-Agent: Mojolicious (Perl)
Content-Length: 208
Content-Type: multipart/form-data; boundary=75OiX
Accept-Encoding: gzip
Host: httpbin.org

--75OiX
Content-Disposition: form-data; name="session"

deadbeef
--75OiX
Content-Disposition: form-data; name="some_file"; filename="upload_file.csv"

upload,this,file
here's,another,line

--75OiX--

Response:
HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Credentials: true
Date: Sat, 25 Apr 2020 03:44:04 GMT
Access-Control-Allow-Origin: *
Content-Length: 516
Content-Type: application/json
Server: gunicorn/19.9.0

{
  "args": {},
  "data": "",
  "files": {
    "some_file": "upload,this,file\nhere's,another,line\n"
  },
  "form": {
    "session": "deadbeef"
  },
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Length": "208",
    "Content-Type": "multipart/form-data; boundary=75OiX",
    "Host": "httpbin.org",
    "User-Agent": "Mojolicious (Perl)",
    "X-Amzn-Trace-Id": "Root=1-5ea3b204-12cfdb84b9c9c504da559e80"
  },
  "json": null,
  "origin": "199.170.132.3",
  "url": "http://httpbin.org/post"
}

У меня есть еще много примеров в Mojolicious Web Clients .

...