如何将调用rest服务的C#代码转换为Delphi XE4

如何将调用rest服务的C#代码转换为Delphi XE4,c#,web-services,delphi,rest,delphi-xe4,C#,Web Services,Delphi,Rest,Delphi Xe4,有人能帮我把下面的C代码转换成Delphi XE4吗 //Libraries //Custom parameters string url = "REST_SERVICE_URL"; string sAuthorization = "USERNAME:PASSWORD"; string fileName = "FILENAME.zip"; string filePath = @"FILE_PATH" + fileName; //Identificate separator string bou

有人能帮我把下面的C代码转换成Delphi XE4吗

//Libraries
//Custom parameters
string url = "REST_SERVICE_URL";
string sAuthorization = "USERNAME:PASSWORD";
string fileName = "FILENAME.zip";
string filePath = @"FILE_PATH" + fileName;

//Identificate separator
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
//Encoding
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

//Creation and specification of the request
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Method = "POST";
wr.KeepAlive = true;

wr.Credentials = System.Net.CredentialCache.DefaultCredentials;  //Authentication
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(sAuthorization);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
wr.Headers.Add("Authorization: Basic " + returnValue);

//Writting of the file
Stream rs = wr.GetRequestStream();
rs.Write(boundarybytes, 0, boundarybytes.Length);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(filePath);
rs.Write(formitembytes, 0, formitembytes.Length);
rs.Write(boundarybytes, 0, boundarybytes.Length); 
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
string header = string.Format(headerTemplate, "file", fileName, "application/octet-stream");
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length); 
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) = 0)
{
    rs.Write(buffer, 0, bytesRead);
}
fileStream.Close(); 
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();
rs = null; 
try
{
    //Get the response

Delphi随Indy一起提供,Indy具有
TIdHTTP
组件和
TIdMultipartFormDataStream
类,例如:

uses
  ..., IdHTTP, IdMultipartFormData;

var
  filename: string;
  filePath: string;
  HTTP: TIdHTTP;
  PostData: TIdMultipartFormDataStream;
begin
  fileName := 'FILENAME.zip';
  filePath := 'FILE_PATH' + fileName;

  PostData := TIdMultipartFormDataStream.Create;
  try
    PostData.AddFile('file', filePath, 'application/octet-stream');

    HTTP := TIdHTTP.Create;
    try
      HTTP.Request.Username := 'USERNAME';
      HTTP.Request.Password := 'PASSWORD';
      HTTP.Request.BasicAuthentication := True;

      HTTP.Post('REST_SERVICE_URL', PostData);
    finally
      HTTP.Free;
    end;
  finally
    PostData.Free;
  end;

  //process the response as needed
end;
TIdHTTP.Post()
可以以
字符串的形式返回服务器的响应数据

var
  Response: String;

Response := HTTP.Post('REST_SERVICE_URL', PostData);
或者作为
TStream

var
  Response: TMemoryStream;

Response := TMemoryStream.Create; // or whatever TStream class you want
try
  HTTP.Post('REST_SERVICE_URL', PostData, Response);
  ...
finally
  Response.Free;
end;

谢谢雷米的提示,这对我很有帮助,所以我创建了这个有两个功能的单元,现在看起来一切都很好!我使用Delphi2006和DelphiXe2。dpallas您可以根据需要免费修改此代码:

unit Umyf;

interface

{
 //Myf REST Calls for https://www1.gsis.gr
 //George Panagiotopoulos
 //gppanagiotopoulos@yahoo.gr
 //Created 07/04/2014
********************************************************************************
 //PostMyfFile : Posting file to server
 //how to use PostMyfFile:
 // var id : integer;status,errormsg : string; succeed: Boolean;
 //filePath is the full path of the file : filepath + filename
 //succeed := PostMyfFile(URL,filePath, Username,Password,id,status,errormsg);

 //GetMyfFile  : getting file status from server
 //how to use GetMyfFile:
 //var id : integer;status,errormsg : string; succeed: Boolean;
 //id:=26099; // file id
 //succeed := GetMyfFile(URL,Username,Password,id,status,errormsg);
********************************************************************************
 //To use Indy's OpenSSL class, TIdSSLIOHandlerSocketOpenSSL,
 //you may need ssleay32.dll, libeay32.dll and ssleay32.dll (x32 or x64).
 //You can get them from http://indy.fulgan.com/ZIP/

 //DELPHI2010ANDUP directive is for delphi 2009 to XE5
}

{$IFDEF VER200}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER210}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER220}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER230}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER240}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER250}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}
{$IFDEF VER260}
  {$DEFINE DELPHI2010ANDUP}
{$ENDIF}

uses Classes,SysUtils,Windows,IdHTTP,IdSSLOpenSSL,IdGlobal,IdMultipartFormData;

function PostMyfFile(const URL, FilePath, Username, Password  : string;
                     var id : integer;
                     var status : string;
                     var errormsg : string):Boolean;
function GetMyfFile (const URL, Username, Password  : string; const id : integer;
                     var status : string;
                     var errormsg : string):Boolean;


implementation

//default messages from API
const s_FAIL  = 'fail';
      s_OK    = 'ok';
      s_PR    = 'processing';
      s_Bound = '---------------------------';
      CR      = #13;

procedure ParseXmlStr(XmlStr : string;
                      var id : integer;
                      var status : string;
                      var errormsg : string);
var StrList : TStringList;
    i       : integer;
begin
   id:=0;
   status:=s_FAIL;
   if xmlStr<>Emptystr then
   begin

     StrList := TStringList.Create;
     try
       StrList.Text      := AnsiLowerCase(XmlStr);   //make all letters lowercase
       StrList.Delimiter := CR;
       for I := 0 to StrList.Count-1 do
       begin
          if Pos('<id>',StrList[i])>0      then
              id:= StrToIntDef(
                               Trim(
                                    StringReplace(
                                                  StringReplace(StrList[i], '<id>', '',[rfReplaceAll]),
                                                  '</id>', '',[rfReplaceAll])
                                    )
                               ,0);
          if Pos('<status>',StrList[i])>0  then
             status := Trim(
                            StringReplace(
                                          StringReplace(StrList[i], '<status>', '',[rfReplaceAll]),
                                          '</status>', '',[rfReplaceAll])
                            );
          if Pos('<error>',StrList[i])>0  then
          begin
             errormsg:=StringReplace(
                                    StringReplace(StrList[i], '<error>', '',[rfReplaceAll]),
                                    '</error>', '',[rfReplaceAll]);
          end;
       end;
     finally
        StrList.Free;
     end;
   end;
end;

function PostMyfFile(const URL,FilePath,Username,Password  : string;
                     var Id : integer;
                     var Status : string;
                     var Errormsg : string):Boolean;
var
  HTTP: TIdHTTP;
  PostData: TIdMultipartFormDataStream;
  Response,Bound : string;
begin
  Result:= false;
  Id     := 0;
  Status := s_FAIL;
  try
    //check if file exists
    if not FileExists(FilePath) then raise Exception.Create(format('File <%s> does not exist!!',[FilePath]));
    //calculate Boundary
    Bound := s_Bound+IntToHex(GetTickcount,15);
    PostData := TIdMultipartFormDataStream.Create;
    try
      // add file to  DataStream
      PostData.AddFile('file', filePath, 'application/octet-stream');
      HTTP := TIdHTTP.Create;
      try
        //add ssl support if needed
        if Pos('https://', AnsiLowerCase(url))>0 then
        begin
           HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
{$IFNDEF DELPHI2010ANDUP}
          //Delphi 2006 requires this else create exception
          ( HTTP.IOHandler as TidSSLioHandlerSocketOpenSSL).SSLOptions.Method := sslvSSLv23 ;
          ( HTTP.IOHandler as TidSSLioHandlerSocketOpenSSL).SSLOptions.Mode:=sslmClient;
{$ENDIF}
      end;
{$IFNDEF DELPHI2010ANDUP}
        //Delphi 2006 requires this to avoid timeout
        HTTP.ReadTimeout := 0;
{$ENDIF}
        HTTP.Request.ContentType := 'multipart/form-data; boundary='+ Bound;
        HTTP.Request.Username := Username;
        HTTP.Request.Password := Password;
        HTTP.Request.Connection := 'Keep-Alive';
        HTTP.Request.BasicAuthentication := True;
        //POST  DataStream
        response := HTTP.Post(URL, PostData);
        //handle response
        ParseXmlStr(Response,Id,Status,Errormsg);
        Result := (Id>0) and ((status =s_OK)or(Status =s_PR));
      finally
        HTTP.Free;
      end;
    finally
      PostData.Free;
    end;
  except
     on e : exception do
        Errormsg := e.Message;
  end;
end;

function GetMyfFile(const URL,Username,Password  : string;
                    const ID : integer;  //ID of the file : stored in database
                    var Status : string;
                    var Errormsg : string):Boolean;
var
  HTTP: TIdHTTP;
  Sid : integer;
  Response : string;
begin
  Result:= false;
  Sid:= 0;
  Status:= s_FAIL;
  try
    HTTP := TIdHTTP.Create;
    try
      //add ssl support if needed
      if Pos('https://', AnsiLowerCase(url))>0 then
      begin
         HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
{$IFNDEF DELPHI2010ANDUP}
        //Delphi 2006 requires this else create exception
        ( HTTP.IOHandler as TidSSLioHandlerSocketOpenSSL).SSLOptions.Method := sslvSSLv23 ;
        ( HTTP.IOHandler as TidSSLioHandlerSocketOpenSSL).SSLOptions.Mode:=sslmClient;
{$ENDIF}
      end;
{$IFNDEF DELPHI2010ANDUP}
      //Delphi 2006 requires this to avoid timeout
      HTTP.ReadTimeout := 0;
{$ENDIF}
      HTTP.Request.Username:= Username;
      HTTP.Request.Password:= Password;
      HTTP.Request.Connection := 'Keep-Alive';
      HTTP.Request.BasicAuthentication := True;
      //Get url + id of the file
      if (url[Length(url)]<> '/') then
         response:= HTTP.GET(url + '/' + inttostr(id))
      else
         response:= HTTP.GET(url + inttostr(id));
      //handle response
      ParseXmlStr(response,Sid,Status,Errormsg);
      Result := (Id=Sid) and ((Status =s_OK)or(Status =s_PR));
    finally
      if assigned(HTTP.IOHandler) then HTTP.IOHandler.Free;
      HTTP.Free;
    end;
  except
     on e : exception do
        Errormsg := e.Message;
  end;
end;

end.
单位Umyf;
接口
{
//多年筹资框架要求提供剩余资金https://www1.gsis.gr
//乔治·帕纳吉奥托普洛斯
//gppanagiotopoulos@yahoo.gr
//创建于2014年4月7日
********************************************************************************
//PostMyfFile:将文件发布到服务器
//如何使用PostyFile:
//变量id:integer;状态,errormsg:string;成功:布尔值;
//filePath是文件的完整路径:filePath+filename
//成功:=PostMyfFile(URL、文件路径、用户名、密码、id、状态、errormsg);
//GetMyfFile:从服务器获取文件状态
//如何使用GetMyfFile:
//变量id:integer;状态,errormsg:string;成功:布尔值;
//id:=26099;//文件id
//成功:=GetMyfFile(URL、用户名、密码、id、状态、errormsg);
********************************************************************************
//要使用Indy的OpenSSL类TIdSSLIOHandlerSocketOpenSSL,
//您可能需要ssleay32.dll、libeay32.dll和ssleay32.dll(x32或x64)。
//你可以从http://indy.fulgan.com/ZIP/
//DELPHI2010ANDUP指令适用于delphi 2009至XE5
}
{$IFDEF VER200}
{$2010andup}
{$ENDIF}
{$IFDEF VER210}
{$2010andup}
{$ENDIF}
{$IFDEF VER220}
{$2010andup}
{$ENDIF}
{$IFDEF VER230}
{$2010andup}
{$ENDIF}
{$IFDEF VER240}
{$2010andup}
{$ENDIF}
{$IFDEF VER250}
{$2010andup}
{$ENDIF}
{$IFDEF VER260}
{$2010andup}
{$ENDIF}
使用类、SysUtils、Windows、IdHTTP、IdSSLOpenSSL、IdGlobal、IdMultipartFormData;
函数PostMyfFile(常量URL、文件路径、用户名、密码:字符串;
var-id:整数;
var状态:字符串;
var errormsg:string):布尔值;
函数GetMyfFile(常量URL、用户名、密码:字符串;常量id:整数;
var状态:字符串;
var errormsg:string):布尔值;
实施
//来自API的默认消息
常数s_FAIL='FAIL';
s_OK=‘OK’;
s_PR=‘处理’;
s_界='-------------------------------';
CR=#13;
过程ParseXmlStr(XmlStr:string;
var-id:整数;
var状态:字符串;
var errormsg:string);
var StrList:TStringList;
i:整数;
开始
id:=0;
状态:=s_失败;
如果xmlStrEmptystr那么
开始
StrList:=TStringList.Create;
尝试
StrList.Text:=AnsiLowerCase(XmlStr)//使所有字母都小写
StrList.Delimiter:=CR;
对于I:=0到StrList.Count-1 do
开始
如果Pos(“”,StrList[i])>0,则
id:=StrToIntDef(
修剪(
StringReplace(
StringReplace(StrList[i]、“”、[rfReplaceAll]),
'',[rfReplaceAll])
)
,0);
如果Pos(“”,StrList[i])>0,则
状态:=修剪(
StringReplace(
StringReplace(StrList[i]、“”、[rfReplaceAll]),
'',[rfReplaceAll])
);
如果Pos(“”,StrList[i])>0,则
开始
errormsg:=StringReplace(
StringReplace(StrList[i]、“”、[rfReplaceAll]),
“,”,[rfReplaceAll]);
结束;
结束;
最后
StrList.Free;
结束;
结束;
结束;
函数PostMyfFile(常量URL、文件路径、用户名、密码:字符串;
var-Id:整数;
var状态:字符串;
var Errormsg:string):布尔值;
变量
HTTP:TIdHTTP;
PostData:TIdMultipartFormDataStream;
响应,绑定:字符串;
开始
结果:=假;
Id:=0;
状态:=s_失败;
尝试
//检查文件是否存在
如果文件不存在(文件路径),则引发异常。创建(格式('File not exists!!',[FilePath]);
//计算边界
绑定:=s_绑定+IntToHex(GetTickcount,15);
PostData:=TIdMultipartFormDataStream.Create;
尝试
//将文件添加到数据流
AddFile('file',filePath,'application/octet stream');
HTTP:=TIdHTTP.Create;
尝试
//如果需要,添加ssl支持
如果Pos('https://',AnsiLowerCase(url))>0,则
开始
HTTP.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
{$IFNDEF DELPHI2010ANDUP}
//Delphi 2006需要此else创建异常
(HTTP.IOHandler作为TidSSLioHandlerSocketOpenSSL)。SSLOptions.Method:=sslvSSLv23;
(HTTP.IOHandler作为TidSSLioHandlerSocketOpenSSL).SSLOptions.Mode:=sslmClient;
{$ENDIF}
结束;
{$IFNDEF DELPHI2010ANDUP}
//Delphi2006需要这样做以避免超时
HTTP.ReadTimeout:=0;
{$ENDIF}
HTTP.Request.ContentType:='多部分/表单数据;边界='+边界;
HTTP.Request.Username:=用户名;
HTTP.Request.Password:=密码;
HTTP.Request.Connection:=“保持活动状态”;
HTTP.Request.BasicAuthentication:=True;
//后数据流
响应:=HTTP.Post(URL,PostData);
//处理响应
ParseXmlStr(response)