2011-12-29 24 views
5

có thể đổ tất cả các trường tiêu đề của đối tượng TWebRequest (và TWebResponse) không? Tại thời điểm này tôi sử dụng GetFieldByName() và in chúng bằng Writeln() nhưng điều này chỉ hoạt động nếu tôi đã biết tên của trường tiêu đề. Tôi đang tìm một cách để có được tất cả các lĩnh vực tên tiêu đề để enumarate mỗi lĩnh vực nhưng tôi đã không tìm thấy bất kỳ phương pháp để làm điều đó.Liệt kê các trường tiêu đề HTTP TWebRequest

Tôi đã viết một ứng dụng bảng điều khiển REST datasnap và muốn ghi lại tất cả các yêu cầu/phản hồi HTTP vào bàn điều khiển.

Trả lời

4

AFAIK nó không khả dụng (Delphi XE2).

Tôi đã sử dụng một chút xíu để có quyền truy cập vào các tiêu đề thô. Tuy nhiên, điều này thực sự là bẩn! Sử dụng bạn có rủi ro!

Lớp yêu cầu lớp thực tế là TIdHTTPAppRequest (CẢNH BÁO: Có thể khác với loại ứng dụng webbroker khác nhau. Tôi chưa thử nghiệm mã này với loại ứng dụng dữ liệu khác).

Vì vậy, các Bí quyết là:

Khai báo một helper lớp tương tự như sau:

TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest 
    public 
    function GetRequestInfo: TIdEntityHeaderInfo; 
    end; 

    implementation 

    function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo; 
    begin 
    Result := FRequestInfo; 
    end; 

Bằng cách này bạn có thể sử dụng helper này có TRUY CẬP đến lĩnh vực FRequestInfo bảo vệ.

Trong xử lý sự kiện OnAction bạn có thể sử dụng đoạn mã sau để có tất cả những cái tên tiêu đề:

procedure Twm.wmWebActionItem1Action(Sender: TObject; Request: TWebRequest; 
       Response: TWebResponse; var Handled: Boolean); 
var 
    HeadersCount: Integer; 
    I: Integer; 
    sw: TStreamWriter; 
begin 
    Response.ContentType := 'text/plain'; 
    Response.ContentStream := TMemoryStream.Create; 
    sw := TStreamWriter.Create(Response.ContentStream); 
    try 
    HeadersCount := TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.Count; 
    for I := 0 to HeadersCount - 1 do 
     sw.WriteLine(TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.Names[I]); 
    finally 
    sw.Free; 
    end; 
    Handled := True; 
end; 

Tuy nhiên, nó là xấu mà TWebRequest không cho phép đọc các tiêu đề thô. Điều đó nên được thay đổi!

+0

Điều đó đã khiến mẹo cảm ơn bạn :) – MBulli

Các vấn đề liên quan