【发布时间】:2021-11-24 23:20:20
【问题描述】:
根据提供的文档,我正在调用 API URL 和一些 parameters。
按照 API 的设置方式,响应应该是自动下载 .pdf 文件。
参数为:
-
number- 代表 13 位数字,代表系统中的唯一文件指示符(例如:5277110610029) -
username和user_pass分别代表访问系统的登录凭据 -
client_id- 代表在他们的系统中与我的帐户关联的唯一客户 ID -
language- 我指出文件内容应使用的语言(英语或其他可用语言)
文档表明它应该作为Post 请求。
我有以下代码:
var
FileName : string;
URL: String;
Params: TStringList;
memStream: TMemoryStream;
...
begin
FileName:= MainModule.PDFfileName + '.pdf';
begin
URL := 'https://someURL/view_integrated_pdf.php?';
Params := TStringList.Create;
memStream := TMemoryStream.Create;
try
Params.Add('number='+MainModule.number+'');
Params.Add('username='+MainModule.User+'');
Params.Add('client_id='+MainModule.clientID+'');
Params.Add('user_pass='+MainModule.Pass+'');
Params.Add('language=en');
MainModule.IdHTTP.Post(URL, Params, memStream);
finally
memStream.SaveToFile(ServerModule.FilesFolderPath+'\pdfs\'+FileName);
Params.Free;
memStream.Free;
end;
end;
pdfForm.ShowModal();
end;
如果我在浏览器中尝试生成的 URL 和 parameters - 它会自动下载 API 给我的名为 numberParameter.pdf 的 pdf 文件
如果我使用提供的代码在 Delphi 中执行此操作,则 10 次中有 8 次会保存 pdf file 和 1 KB Size(通常它在成功文件的 32 和 100 之间)并且当我尝试使用我的pdfForm 和随后的viewer 在程序中打开它,查看器会抛出错误"Invalid PDF structure"
- 我做错了什么? / 如何正确保存返回 .pdf 文件以从 API 下载的 Post 请求?
更新
根据 cmets,在 Notepad++ 中打开 1kb 生成的 PDF 会简单地将内容显示为 Error username.
这令人费解,因为我检查过并且传递的用户名是准确的 + 如果我在浏览器中粘贴带有参数值的完全相同的 URL,它可以完美运行并为我提供正确的 PDF。
- 我的代码不是正确的发布和保存正在发送的文件的方法吗?
【问题讨论】:
-
服务器的响应是什么?您可以尝试在一些高级文本编辑器中打开您保存的文件并查看内容。
-
@MiroslavPenchev 在delphi应用程序中运行代码后,什么也没有。 pdfForm 作为模式弹出,它应该显示 pdf 文件 - 只有它告诉我它的结构无效。使用 Adobe 在 Windows 上打开它告诉我它无法打开它(加上 1kb 对应的大小)。使用 Notepad++ 打开它(感谢您的建议 - 刚刚尝试过)将文件内容显示为错误用户名(这是错误的,因为我检查了用户名并在浏览器中粘贴了相同的 URL)。猜API而不是给我pdf内容只是将错误消息写入文件。
-
因此,您很可能会得到一些带有错误消息/代码的 HTML。如果是这种情况 - 那么您执行的 POST 请求不是服务器所期望的,它会给您一个错误,而不是您期望的 PDF。
-
@MiroslavPenchev 是的。但我没有看到我的代码有任何问题(可能除了使用 memStream?)你同意吗?
-
@t1f 这无关紧要:服务器可能会遇到与您的代码或请求的完美程度无关的问题 - 您必须期待否定响应。