1
procedure Texport_plan.cxB_LoadClick(Sender: TObject);
var
  HTTP: TIdHTTP;
  Query: String;
  Buffer: TMemoryStream;
  loadData: Sting;
  responseData: String; 
begin 
  try
    HTTP := TIdHTTP.Create(nil);
    HTTP.Request.ContentEncoding := 'utf-8';
    HTTP.Request.ContentType := 'text/xml';
    Application.ProcessMessages;

    Query := 'http://priem.edu.ru:8000/import/ImportService.svc/import';
    loadData := '<Root></Root>'

    Buffer := TMemoryStream.Create;
    loadData.SaveToStream(Buffer);
    responseData := HTTP.Post(Query, Buffer);
  except
    on E: EIdHTTPProtocolException do
      ShowMessage(E.Message);
  end;
end;

これは HTTP/1.1 400 Bad Request を返します。http://priem.edu.ru:8000/import/ImportService.svc/test/importから get を使用すると 、応答で適切な xml ドキュメントが取得されます。なぜこれが起こるのでしょうか?私はグーグルで見つけることができるすべてをチェックしました...しかし、何も役に立ちません。

RAD Delphi XE3を使用しています

UPD:テスト クライアントは正常に動作します... C# + webclient クラス。IdHTTP だけでなく、delphi にもっと何かが存在する可能性がありますか?

4

2 に答える 2

2

編集

Charsetandの代入順序ContentTypeが重要であることが判明しました。

単語ContentTypeを含む、または で終わる を使用すると、文字セットは強制的にその値に設定され、それ以外の場合はすべて に設定されます。xmlxml-external-parsed-entity +xml'us-ascii''ISO-8859-1'

動作は文書化されていないため、バグまたは実装の詳細と考えるのは自由です。

TIdEntityHeaderInfo.SetContentType( IdHTTPHeaderInfo.pas)の本文にある Remy からのコメントは次のとおりです。

// RLebeau: RFC 3023 セクション 3.1、3.3、3.6、および 8.5 ごと:
//
// [RFC2046] に準拠、文字セット パラメータを省略して // text/xml エンティティを受信し
た場合、MIME プロセッサおよび XML プロセッサ
// 「us-ascii」[ASCII] のデフォルトの文字セット値を使用しなければなりません。
// XML MIME エンティティが HTTP 経由で送信される場合でも、 // デフォルトの文字
セット値は "us-ascii" のままです。(注:
// この仕様と HTTP/1.1 との間に矛盾があります。HTTP/1.1 では、
// 歴史的な理由から、デフォルトとして ISO-8859-1[ISO8859] を使用しています。
// XML は新しいフォーマットであるため、新しいデフォルトにする必要があります。
// I18N. UTF-8 の共通部分であるため、US-ASCII が選択されました。
// および ISO-8859-1 であり、MIME で既に使用されているためです。)

ContentType文字セットを変更するには、次のように値を設定した後に設定する必要があります。

HTTP.Request.ContentType := 'text/xml';
HTTP.Request.Charset := 'utf-8';

元の回答
(まだ有効)

コンテンツが でエンコードされていることを示していますutf-8が、Delphi 文字列はutf-16デフォルトでエンコードされています。

文字列ヘルパーにSaveToStreamエンコーディングをサポートするメソッドのオーバーロードされたバージョンがあるかどうかを確認する Delphi は手元にありませんが、持っているに違いないので、試してみてください。

loadData.SaveToStream(Buffer, TEncoding.UTF8);

データを送信する前に。

于 2013-04-11T06:54:14.610 に答える
0

エラーが見つかりました。If content type is */xml IdHTTP changes Charset to 'us-ansi'... このコンポーネントを適切に動作させるには、変更する必要があります

HTTP.Request.Charset := 'utf-8';
HTTP.Request.ContentType := 'text/xml';

HTTP.Request.ContentType := 'text/xml; charset=utf-8';

したがって、IdHTTP は Charset を us-ansi に変更できず、必要なエンコーディングを取得できます。

于 2013-04-11T10:32:02.793 に答える