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

hivapdat  于 2022-10-16  发布在  其他
关注(0)|答案(1)|浏览(212)

我正在尝试将一个pdf文件发布到一个API。
下面是我的代码:

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);,因为我似乎需要将文件作为‘file’发布到API,所以我决定使用TCustomRESTRequest.AddParameter方法(尽管,为了我的项目,我也使用了注解方法进行了测试)。
目前,当我尝试使用此代码访问API时,收到以下内容:
{“Errors”:“找不到文件”}
然后我问API所有者我应该发布什么样的数据才能让API接受我的文件,他用他用来将文件发布到他的API的C#代码回答:

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);

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

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
Accept-Charset:UTF-8,*;Q=0.8
用户-代理:Embarcadero RESTClient/1.0
J-Token:myToken
内容-长度:836323
主持人:127.0.0.1:5000

ImmuableMultiDict([(‘file’,<FileStorage:‘encett.pdf’(‘app/pdf’)>)])
我不是很熟悉ImmutableMultiDict,但当我用Postman发送相同的文件来测试API时,我得到了相同的结果,但在请求标头中做了一些微小的更改,所以我假设我是在向我的API发布一个文件。
我的最后一次测试是将文件发布到一个网络挂钩。对于 Postman ,它运行得很好。在我的代码中,似乎没有发布任何文件,如您在此处看到的:

最后,我完全搞不懂了:我假设我的pythonAPI收到了一个文件,对吗?如果是这样的话,为什么网络钩子不也接收它呢?

hpxqektj

hpxqektj1#

文件是一个词典,它包含由客户端发送的多部分请求的不同“部分”。
它可能包含多个文件,因此您必须扫描词典
我已经修改了您的示例,以便保存文件以便您可以检查它:

@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)

相关问题