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
相关产品推荐
相关产品推荐

