delphi 发送带有文件和自定义头的PUT请求

nbewdwxp  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(146)

我被一个问题卡住了。
我需要用 Delphi 上传一个文件(CSV文件)到服务器。服务器有一定的要求,必须遵循:

  • 请求必须是HTTP PUT请求。
  • URL请求中必须包含客户端ID,如下所示:example.com/upload/{Client ID}(将替换{Client ID})。
  • 在URL中客户端ID之后必须包含将来接收的文件名,如下所示:example.com/upload/{Client ID}/{Future File Name}{Future File Name}将被替换),它可以与本地文件名不同。
  • API密钥必须位于请求标头中(标头名称:x-api-key)。示例:lXViWTzFic9sM8qe9Ew7JME8xTdBAOMJHdIjK7XkjQ00OWr .

我可以在CURL中执行此操作,如下例所示:(客户ID:d32krpq,以及未来文件名:(一个月七个月一次)

curl -v -X PUT https://example.com/upload/d32krpq/20181023_update.csv --upload-file 20181023_update.csv --header "x-api-key: lXViWTzFic9sM8qe9Ew7JME8xTdBAOMJHdIjK7XkjQ00OWr"

如何使用 Delphi 组件(使用TNetHttpClientTRESTClient)实现这一点?

ctzwtxfj

ctzwtxfj1#

在 Delphi 中,在两个HTTP客户端框架中,都可以在PUT请求中发送多个字段(文件、自定义头、主体字段...):
TNetHTTPClient中,通过Put()方法,你可以使用重载的函数和本地文件路径的字符串参数。并且在TNetHeaders对象的函数的可选参数中,你指定你的自定义头参数。
TNetHeadersTNameValuePair记录的动态数组。
因此,您必须创建TNameValuePair的动态数组,然后使用API密钥创建TNameValuePair记录的示例,并将其添加到动态数组中。
除了在TNetHTTPClient中,您必须自己在URL的请求中直接指定URL segments参数。
最后,使用文件路径的字符串和TNetHeaders对象调用Put()方法,如下例所示:

procedure TForm1.PutFile;
var 
  LHTTP: TNetHTTPClient;
  LHeaders: array of TNameValuePair;
begin 
  SetLength(LHeaders, 1);
  LHeaders[0] := TNameValuePair.Create('x-api-key', 'lXViWTzFic9sM8qe9Ew7JME8xTdBAOMJHdIjK7XkjQ00OWr');

  LHTTP := TNetHTTPClient.Create(nil);
  try
    LHTTP.Put('https://example.com/upload/d32krpq/20181023_update.csv', 'C:/MyFile.csv', nil, LHeaders);
  finally
    LHTTP.Free;
  end;
end;

对于REST客户端库,可以简单地使用TRESTRequest.AddFile()函数添加文件,也可以使用AddParameter()函数添加任何自定义字段作为正文、URL段或头参数。
TRESTClient的另一个优点是可以使用基本URL或定义URL段的资源,如"example.com/upload/{Client ID}/{Future File Name}"
将组件TRESTClientTRESTRequestTRESTResponse放到表单上,将TRESTClient.BaseURL设置为上传服务器,然后编写代码。

procedure TForm1.PutFile;
begin 
  try
    try
      RESTRequest1.Method := TRESTRequestMethod.rmPUT; 
      RESTRequest1.AddFile('File1', 'C:\MyFile.csv', TRESTContentType.ctTEXT_CSV);

      // Adding the parameters to be included in the URL
      RESTRequest1.AddField('Client ID', 'd32krpq', pkURLSEGMENT);
      RESTRequest1.AddField('Future File Name', '20181023_update.csv', pkURLSEGMENT);

      // Adding a header parameter
      RESTRequest1.AddField('x-api-key', 'lXViWTzFic9sM8qe9Ew7JME8xTdBAOMJHdIjK7XkjQ00OWr', pkHTTPHeader); 

      RESTRequest1.Execute; 
    except
      ShowMessage('Uploading failed'); 
    end;
  finally
    ShowMessage(RESTRequest1.Response.Content); // here you can see your server's response
  end;
end;
yfwxisqw

yfwxisqw2#

下面是使用Indy的TIdHTTP组件的另一种方法:

FS := TIdReadFileExclusiveStream.Create('20181023_update.csv');
try
  IdHTTP1.Request.CustomHeaders.Values['x-api-key'] := 'lXViWTzFic9sM8qe9Ew7JME8xTdBAOMJHdIjK7XkjQ00OWr';
  IdHTTP1.Put('https://example.com/upload/d32krpq/20181023_update.csv', FS);
finally
  FS.Free;
end;

相关问题