我已经使用 Delphi XE2 构建了一个 DataSnap REST 服务器,并添加了一个用于通过 TStream 上传文件的服务器方法:
function TServerMethods.updateUploadFile(sFilename: string; UploadStream: TStream): string;
我希望能够从许多不同的客户端(Android、iOS 等)调用它,并且我一直在使用各种 REST 客户端(例如 Postman(Chrome 插件))测试该方法。但是到目前为止,我无法让它接受 HTTP POST 正文的内容。每当我发送 POST 命令时,我总是得到以下响应:
{"error":"Message content is not a valid JSON value."}
我尝试过使用各种不同的“内容类型”设置,但似乎没有任何效果。看起来好像 DataSnap 坚持内容是 JSON?我尝试将一些有效的 JSON 粘贴到内容区域,但这也给出了相同的错误响应。
有没有人成功使用 TStream 作为 DataSnap 服务器方法的输入参数?我应该以另一种方式做吗?我已经多次使用TStream作为下载文件的输出参数,效果很好,这是我第一次尝试上传。
更新
我制作了一个快速的 Delphi DataSnap 客户端来测试 uploadFile 服务器方法,这一切都很好。然后我使用 Fiddler 检查 Delphi 客户端用于在内容正文中发送 TStream 的 POST 命令,并注意到它是一个整数(字节)的 JSON 数组,例如[37,80,68,70,45,49,46,51,13,10]
。所以我可以看到我可以在 POST 之前修改我的 Android/iOS 客户端以将二进制数据转换为这种字节数组格式,但这是我可以做到的开销。如果 DataSnap 在 TStream 是返回参数时流式传输原始二进制文件,为什么它不能将原始二进制文件作为输入参数传输?