首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将PDF文件发布到基于REST的API中?

如何将PDF文件发布到基于REST的API中?
EN

Stack Overflow用户
提问于 2022-10-12 13:22:26
回答 1查看 204关注 0票数 0

我正试图将一个pdf文件发布到api中。

下面是我的代码:

代码语言:javascript
运行
复制
procedure AttachDocument(pathFile : String);
  var 
    RESTClient : TRESTClient;
    RESTRequest : TCustomRESTRequest; 
    Response : TCustomRESTResponse;
  begin
    RESTClient := TRESTClient.Create('');
    try
      RESTRequest := TCustomRESTRequest.Create(nil);
      try
        RESTClient.BaseURL('api_url');
        RESTRequest.Client := RESTClient;
        RESTRequest.Accept := 'application/json';
        RESTRequest.Params.AddHeader('j_token','mytoken').Options := 1; //This is adding poDoNotEncode
        RESTRequest.Method := rmPOST
        RESTRequest.AddParameter('file',pathFile,pkFILE,1); // Same as above 1 = poDoNotEncode
        //RESTRequest.AddFile(pathFile, ctAPPLICATION_PDF);
        RESTRequest.Execute;
        Response := RESTRequest.Response;
        ShowMessage(Response.Content);
      finally
        RESTRequest.Free;
      end;
    finally
      RESTClient.Free;
    end;
  end;

出于某种原因,我只能使用procedure AddFile(const AFileName: string; AContentType: TRESTContentType = TRESTContentType.ctNone);,而且由于我似乎需要将文件作为“文件”发布到api,所以我决定使用TCustomRESTRequest.AddParameter方法(尽管为了我的项目,我也用注释方法进行了测试)。

目前,当我试图使用以下代码访问api时,我会收到以下信息:

{“错误”:“没有找到文件”}

然后,我问api所有者我应该为api发布什么样的数据来接受我的文件,他用他用来将文件发布到api中的C#代码进行了回应:

代码语言:javascript
运行
复制
var client = new RestClient("api_url");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "multipart/form-data");
request.AddHeader("v", "4.2");
request.AddHeader("j_token", "histoken");
request.AddFile("file", "/C:/Users/olivm/Documents/QA API Swagger/smartpacte2.pdf", "application/.pdf");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

到目前为止,我没有看到我们的代码之间有什么重大差异,所以我决定在本地python上测试我的代码,如下所示:

代码语言:javascript
运行
复制
from flask import Flask, jsonify, abort, request

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
  print("POST / ENDPOINT")
  headers = request.headers
  file = request.files
  print(headers)
  print(file)
  return "Request headers:\n" + str(headers) + str(file)

if __name__ == "__main__":
  app.run(port=5000, host="0.0.0.0")

这就是我在用RESTClient.BaseURL('127.0.0.1:5000');测试我的代码时收到的

请求头:

连接:保持-活着

内容.类型:多部分/表格-数据;boundary=-------Embt-Boundary--15DE48857EEC829D

接受:申请/json

接受-字符集: utf-8,*;q=0.8

用户代理: Embarcadero RESTClient/1.0

J-标记:我的标记

内容长度: 836323

主持人: 127.0.0.1:5000

--

ImmutableMultiDict(('file',)

我不太熟悉ImmutableMultiDict,但是当我用Postman通过发送相同的文件来测试api时,我得到了相同的结果,在请求头中做了一些微小的更改,所以我假设我是在向我的api发送一个文件。

我的最后一个测试是将文件发布到web钩子上。对邮递员来说,一切都很顺利。使用我的代码,您可以在这里看到似乎没有发布任何文件:

最后,我完全迷失了方向:我认为python收到了一个文件,这是正确的吗?如果是的话,那为什么网钩也没有收到呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-12 13:40:29

request.files是一个字典,包含客户端发送的多部分请求的不同“部分”。

它可能包含多个文件,因此必须扫描字典。

为了保存文件,我修改了您的示例,以便您可以检查它:

代码语言:javascript
运行
复制
@app.route('/', methods=['GET', 'POST'])
def home():
  print("POST / ENDPOINT")
  headers = request.headers
  for key, file in request.files.items():
    if file.filename != '':
        dest = os.path.join(os.path.dirname(__file__), file.filename)
        file.save(dest)
        print(f'saved into {dest}.')

  return "Request headers:\n" + str(headers) + str(file)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74042600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档