我正在尝试将一个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收到了一个文件,对吗?如果是这样的话,为什么网络钩子不也接收它呢?
1条答案
按热度按时间hpxqektj1#
文件是一个词典,它包含由客户端发送的多部分请求的不同“部分”。
它可能包含多个文件,因此您必须扫描词典
我已经修改了您的示例,以便保存文件以便您可以检查它: