You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中REST服务器获取客户端Header密钥及访问限制问题

小型REST服务器API密钥验证问题

我正在搭建一个供内部24人使用的小型REST服务器,已经配置好GET请求可以返回JSON格式数据,但希望仅允许自己开发的应用访问,禁止浏览器请求(数据不敏感)。尝试用TRESTClient在GET请求的Header里传递apikey密钥,但服务器端拿不到这个密钥,甚至不确定客户端有没有成功发送。目前数据能正常获取,但不确定Header字段的传输和服务器端获取逻辑是否正确。

服务器端GET处理代码

procedure TWebModule1.WebModule1WebActionItemSiteOrdersGETAction(
  Sender: TObject; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  lParameters : TStringDynArray;
  orderRes : TArray<OrderHeader>;
  jsonResult : string;
  I: Integer;
  dataQuery : TDataQuery;
  authToken : string;
begin
  lParameters := GetParameters((Sender as TWebActionItem).PathInfo,Request.PathInfo);
// 尝试获取Header中的密钥
  authToken := Request.GetFieldByName('apikey');
  if Length(lParameters) >= 3 then
    begin
      try
        Response.ContentType := 'application/json;charset=utf-8';
        dataQuery := TDataQuery.Create;
        orderRes := dataQuery.getOrders(lParameters[0],lParameters[1],lParameters[2]);
        if Length(orderRes) > 0 then
          begin
            jsonResult := '[';
            for I := 0 to Length(orderRes) - 1 do
              begin
                if i = 0 then
                  jsonResult := jsonResult + '{"key": "' + orderRes[i].orderKey + '","order": "' + orderRes[i].orderID + '","orderDate": "' + orderRes[i].orderDate + '","orderStatus":"' + orderRes[i].orderStatus + '","vendorNo": "' + orderRes[i].orderVendID +  '","vendorName": "' + orderRes[i].orderVendName + '"}'
                else
                  jsonResult := jsonResult + ',{"key": "' + orderRes[i].orderKey + '","order": "' + orderRes[i].orderID + '","orderDate": "' + orderRes[i].orderDate + '","orderStatus":"' + orderRes[i].orderStatus + '","vendorNo": "' + orderRes[i].orderVendID +  '","vendorName": "' + orderRes[i].orderVendName + '"}'
              end;
            jsonResult := jsonResult + ']';
            Response.Content := jsonResult;
          end
        else
          Response.Content := '{"error":"Item not found"}';
      finally
        dataQuery.Destroy;
        dataQuery := nil;
      end;
    end;

  Handled := true;
end;

测试客户端GET请求代码

procedure TForm2.btnGETClick(Sender: TObject);
var
  JSONValue : TJSONValue;
  strResponse : string;
begin
  RestClient1.BaseURL := edtURL.Text;
  // 不确定Header该在Client还是Request层级设置,所以两边都试了
  RestClient1.SetHTTPHeader('apikey','1234567');
  RestClient1.Params.ParameterByName('apikey').Value := '1234568';
  RestRequest1.Params.ParameterByName('apikey').Value := '1234569';

  RestRequest1.Execute;
  try
    strResponse := RestResponse1.Content;
    memResp.Text := strResponse;
  finally

  end;
end;

更新
我已找到解决方法并在下方发布了答案,感谢大家。


内容的提问来源于stack exchange,提问作者jetblackrogue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:35:19