当前位置: 首页 > 知识库问答 >
问题:

使用 REST 的 perl 多部分请求::客户端

嵇俊德
2023-03-14

我正在使用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 {
}

当我运行脚本时,出现以下错误:

解析多部分servlet请求失败;嵌套异常java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界]

我是perl新手,语法或其他方面有什么问题吗?

共有1个答案

宓博实
2023-03-14

REST::客户端希望您生成整个消息体,但您没有这样做。实际上,您不应该尝试手动构造请求(甚至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客户端中有更多的例子。

 类似资料:
  • 我试图用Java编写一个客户机来从RESTful web服务中获取数据。我已经看了几个教程和视频,但有一些我不明白。让我从这个开始。我能够使用PEST编写一个clientin PHP来获得成功的响应。这是一个如何发出请求的示例: 我发现有些事情很尴尬,我不太熟悉RESTful客户。出于某种原因,该站点使用POST请求而不是GET请求。凭据作为表单数据和任何查询参数在主体中传递。我查看的教程不是这样

  • 如何使用 REST::客户端向 REST API 发送“多部分/表单数据”请求?有问题的API就在这里,这个特定的请求是有问题的。对于其他帖子请求,我可以简单地将数据作为JSON发送,使用 然而,因为这可能需要一个文件,所以我似乎必须使用“multipart/form-data”作为Content-Type。我已经尝试了很多方法,例如以JSON格式发送数据(它不会拾取api_key),使用REST

  • 我想用Spring MVC发布一个包含一些JSON数据的文件。所以我开发了一个rest服务作为

  • 问题内容: 我有一个API端点,必须向其发送多部分HTTP请求,该请求由两部分组成(文件系统文件)和(JSON对象)。 经过一些研究,我发现了如何在AngularJS中执行多部分请求: 1) 该函数最初具有以下形式: 此实现的结果是,请求的各个部分没有设置。 Blob ,对象看起来像这样(有点混乱,基本上第一部分是of ,第二个): 第二种方法为请求的每个部分设置了正确的内容,但没有为部分设置任何

  • 我正在使用Multipart执行帖子类型请求。问题是因为我一直收到两个错误 1) 500 2) 422不可处理实体 Api仅接受音乐文件。因此,我添加了一个默认文件,以避免不断选择新文件 和我的界面 如果有任何帮助,我将不胜感激。 我发现它将文件作为对象通过Reform2发送到服务器

  • 我需要向我的Spring控制器发送一个带有json的文件。我有以下控制器类: 但当我在服务器上使用以下命令时: 我得到415不支持的媒体类型! 有线索吗?