我正试图将一个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);
,而且由于我似乎需要将文件作为“文件”发布到api,所以我决定使用TCustomRESTRequest.AddParameter
方法(尽管为了我的项目,我也用注释方法进行了测试)。
目前,当我试图使用以下代码访问api时,我会收到以下信息:
{“错误”:“没有找到文件”}
然后,我问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);
到目前为止,我没有看到我们的代码之间有什么重大差异,所以我决定在本地python上测试我的代码,如下所示:
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收到了一个文件,这是正确的吗?如果是的话,那为什么网钩也没有收到呢?
发布于 2022-10-12 13:40:29
request.files是一个字典,包含客户端发送的多部分请求的不同“部分”。
它可能包含多个文件,因此必须扫描字典。
为了保存文件,我修改了您的示例,以便您可以检查它:
@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)
https://stackoverflow.com/questions/74042600
复制相似问题