我已经在这个问题上工作了太多小时而没有真正取得任何进展。我有一个有效的旧解决方案,但我正在尝试将其移植到 Indy 以使代码更可靠且更易于维护。
我们有一个 servlet,它处理使用 HTTP POST 消息发送给它的请求。消息有一个参数,“command”,它的值决定了 servlet 应该做什么。
目前我有这个:
procedure TIndyLoginServer.SendRequest(Command, Json: string; Request: TRequest);
var
Params: TIdStrings;
ServerResponse: string;
begin
// Build parameters
Params := TStringList.Create();
Params.Add('command=' + Command);
try
// Content type should really be 'application/json' but then the parameters stop working
FIndyHttp.Request.ContentType := 'application/x-www-form-urlencoded';
ServerResponse := FIndyHttp.Post(FUrl, Params);
Request.OnRequestFinished(ServerResponse, '', '');
except
on E: EIdHTTPProtocolException do
begin
Request.OnRequestFinished('', E.Message, '');
end;
on E: EIdSocketError do
begin
if E.LastError = Id_WSAETIMEDOUT then
Request.OnRequestTimedOut();
end;
on E: EIdException do
begin
Request.OnRequestFinished('', E.Message, '');
end;
end;
end;
这种工作,命令到达 servlet 并开始按预期工作。问题是,除了参数之外,我还需要能够将 JSON 编码的对象与 POST 请求一起发送。Java servlet 使用以下代码行接收 JSON 编码的对象
final BufferedReader r = req.getReader();
“req”显然是传入的 POST 请求,缓冲的读取器稍后用于解码对象。但是,我一生都无法弄清楚如何以 servlet 可以读取数据的方式将 JSON 字符串附加到 TidHTTP 实例。
有没有人有任何建议或例子我可以看看?我所发现的只是如何发送文件。也许这就是我要找的?
以及如何在不破坏参数列表的情况下将请求的内容类型设置为“application/json”?如果我更改它,POST 请求仍会到达服务器,但不再找到“命令”参数。