私はこの問題に何時間も取り組んできましたが、実際には何の前進もありませんでした。動作する古いソリューションがありますが、それを Indy に移植して、コードの信頼性を高め、保守を容易にしようとしています。
HTTP POST メッセージを使用して送信されたリクエストを処理するサーブレットがあります。メッセージには「コマンド」という 1 つのパラメータがあり、その値によってサーブレットの動作が決まります。
現在、私はこれを持っています:
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;
この種の作業は、コマンドがサーブレットに到達し、期待どおりに機能し始めます。問題は、パラメーターに加えて、JSON エンコードされたオブジェクトを POST 要求と共に送信できるようにする必要があることです。Java サーブレットは、次のコード行を使用して、JSON でエンコードされたオブジェクトを受け取ります。
final BufferedReader r = req.getReader();
「req」は明らかに着信 POST 要求であり、バッファリングされたリーダーは後でオブジェクトをデコードするために使用されます。ただし、サーブレットがデータを読み取れるように、JSON 文字列を TidHTTP インスタンスにアタッチする方法は、一生わかりません。
私が見ることができる提案や例はありますか? 私が見つけたのは、ファイルを送信する方法だけです。多分それは私が探しているものですか?
また、パラメーター リストを壊さずに、リクエストのコンテンツ タイプを「application/json」に設定するにはどうすればよいですか? 変更すると、POST リクエストは引き続きサーバーに到達しますが、「コマンド」パラメーターは見つかりません。