首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用idhttp发送AMF报头

使用idhttp发送AMF报头
EN

Stack Overflow用户
提问于 2015-12-01 06:11:48
回答 1查看 721关注 0票数 0

是否可以将AMF报头发送到某个站点并获得响应

我找了很多,但没找到

这是我使用的代码,但我不知道如何编写amf头(Post Data !)

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
 var
 SL: TStringList;
 HTTPAgent,FlexEngine ,FlexContent,ContentType:string;
begin


 HTTPAgent   := 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115';
 FlexEngine  := 'http://somesite.com/tools/amf.php';
 ContentType := 'application/x-amf';

 IdHTTP1.Request.UserAgent := HTTPAgent;

 SL := TStringList.Create;
 SL.Add(); // how to write the header

 IdHTTP1.Request.ContentType := ContentType;

 try
 memo1.Text :=  IdHTTP1.Post(FlexEngine, SL);
 finally
  SL.Free;
end;

end;

这篇文章看起来是这样的

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 07:03:01

使用TStringList发布数据将以application/x-www-form-urlencoded格式格式化数据,这不是您希望在这种情况下发生的情况。您需要使用TStream发布AMF数据,以便按原样发布,例如:

代码语言:javascript
复制
unit AMF;

interface

uses
  Classes;

procedure WriteUInt8ToStream(Stream: TStream; Value: Byte);
procedure WriteUInt16ToStream(Stream: TStream; Value: Word);
procedure WriteInt32ToStream(Stream: TStream; Value: Integer);
procedure WriteUInt32ToStream(Stream: TStream; Value: LongWord);
procedure WriteStringToStream(Stream: TStream; const Value: String);

implementation

uses
  IdStack;

procedure WriteUInt8ToStream(Stream: TStream; Value: Byte);
begin
  Stream.WriteBuffer(Value, Sizeof(Value));
end;

procedure WriteUInt16ToStream(Stream: TStream; Value: Word);
begin
  Value := GStack.HostToNetwork(UInt16(Value));
  Stream.WriteBuffer(Value, Sizeof(Value));
end;

procedure WriteInt32ToStream(Stream: TStream; Value: Integer);
begin
  Value := Integer(GStack.HostToNetwork(UInt32(Value)));
  Stream.WriteBuffer(Value, Sizeof(Value));
end;

procedure WriteUInt32ToStream(Stream: TStream; Value: LongWord);
begin
  Value := GStack.HostToNetwork(UInt32(Value));
  Stream.WriteBuffer(Value, Sizeof(Value));
end;

procedure WriteStringToStream(Stream: TStream; const Value: String);
var
  U: UTF8String;
  Len: Word;
begin
  U := UTF8String(Value); // or UTF8Encode(Value) if using D2007 or earlier
  Len := Min(Length(U), $FFFF);
  WriteUInt16ToStream(Stream, Len);
  Stream.WriteBuffer(PAnsiChar(U)^, Len * SizeOf(AnsiChar));
end;

代码语言:javascript
复制
uses
  AMF;

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
  HTTPAgent, FlexEngine, FlexContent, ContentType: string;
begin
  HTTPAgent   := 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115';
  FlexEngine  := 'http://somesite.com/tools/amf.php';
  ContentType := 'application/x-amf';

  IdHTTP1.Request.UserAgent := HTTPAgent;

  MS := TMemoryStream.Create;
  try
    // write AMF data to stream as needed...
    AMF.WriteInt16ToStream(MS, 0); // version
    AMF.WriteUInt16ToStream(MS, 1); // header-count
    AMF.WriteStringToStream(MS, '...'); // header-name
    AMF.WriteUInt8ToStream(MS, 1); // must-understand
    AMF.WriteUInt32ToStream(MS, ...); // header-length
    // write header data as needed ...
    AMF.WriteUInt16ToStream(MS, 1); // message-count
    AMF.WriteStringToStream(MS, '...'); // target-uri
    AMF.WriteStringToStream(MS, '/1'); // response-uri
    AMF.WriteUInt32ToStream(MS, ...); // message-length
    // write message data as needed ...

    MS.Position := 0;

    IdHTTP1.Request.ContentType := ContentType;

    Memo1.Text := IdHTTP1.Post(FlexEngine, MS);
  finally
    MS.Free;
  end;
end;

我将把它作为练习,让您了解如何根据AMF0AMF3规范编写AMF头和消息数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34008967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档