Разобрать строку запроса Url с Delphi 5 - PullRequest
0 голосов
/ 31 октября 2019

У меня есть эта строка:

Вызывается =% 2B12608883475 & ToState = IN & CallerCountry = US & Direction = входящий & CallerState = IN & ToZip = & CallSid = CAb7faaa30058c2347a595630f2475113a & 100 * * 100 * * 125 = 2 * 0 = 85% = 2 575% = 0% = 2 075% = 0% = 2 075% = 0% = 2 075% = 0проанализируйте его по &, чтобы получить все параметры, а затем отсортируйте параметры в алфавитном порядке с учетом регистра.

Все это должно быть сделано в Delphi 5:

Function TwilioSignatureValidate(twilioSignature: string; QueryString: string ; Url: string): boolean;
begin
  parameters := QueryString;
  List := TStringList.Create;
end;

Вот версия C #, которую я хочу скопировать:

string input = "Called=%2B12608883475&ToState=IN&CallerCountry=US&Direction=inbound&CallerState=IN&ToZip=&CallSid=CAb7faaa30058c2347a595630f2475113a&To=%2B12608883475&CallerZip=";

Dictionary<string,string> keyValuePairs = input.Split('&')
    .Select(value => value.Split('='))
    .ToDictionary(pair => pair[0], pair => pair[1]);

string studentId = keyValuePairs["StudentId"];

Использование List.Sort;

Я получил свой список Delphi Для сортировки по алфавиту, но не с использованием сортировки с учетом регистра в стиле Unix: // Delphi Sort https://ffbc1360.ngrok.io AccountSidACc6d06b4cb61ccbfa61bf461957a5a626 ApiVersion2010-04-01 Вызывается + 126088C34CalledStateIN CalledZip Caller + 12602060582 CallerCity CallerCountryUS CallerStateIN CallerZip CallSidCAb7faaa30058c2347a595630f2475113a CallStatusringing Directioninbound С + 12602060582 FromCity FromCountryUS FromStateIN FromZip К + 12608883475 ToCity ToCountryUS ToStateIN ToZip

// Correct C # Сортировать https://ffbc1360.ngrok.io AccountSidACc6d06b4cb61ccbfa61bf461957a5a626 ApiVersion2010-04-01 CallSidCAb7faaa30058c2347a595630f2475113aCallStatusringing Called + 12608883475 CalledCity CalledCountryUS CalledStateIN CalledZip Caller + 12602060582 CallerCity CallerCountry СШАСостояния вызывающего абонентаIN CallerZipНаправление в направлении от + 12602060582 От города до страны США От государства до почтового индекса до + 12608883475 до города до страныС США до государства до почтового индекса

1 Ответ

0 голосов
/ 01 ноября 2019

TStringList в Delphi 6 и более поздних версиях имеет свойства Delimiter, DelimitedText и CaseSensitive. Установите Delimiter на '&', а затем присвойте строку запроса DelimitedText, затем вы можете использовать свойство Values[] для извлечения значений по имени (поскольку результирующие строки с разделителями уже имеют формат name=value). Сортировка не требуется:

Function TwilioSignatureValidate(twilioSignature: string; QueryString: string ; Url: string): boolean;
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.Delimiter := '&';
    List.DelimitedText := QueryString;
    List.CaseSensitive := True;

    // use List.Values['param name'] as needed, eg:
    // List.Values['Called']
    // List.Values['ToState']
    // List.Values['CallerCountry']
    // List.Values['Direction']
    // List.Values['CallerState']
    // List.Values['ToZip']
    // List.Values['CallSid']
    // List.Values['To']
    // List.Values['CallerZip']
  finally
    List.Free;
  end;
end;

Однако в Delphi 5 ни одно из этих свойств еще не существовало, поэтому вам придется делать все вручную:

Function TwilioSignatureValidate(twilioSignature: string; QueryString: string ; Url: string): boolean;
var
  List: TStringList;

  // the following are tweaked from TStrings in later Delphi versions...

  procedure MySetDelimitedText(const Value: string);
  var
    P, P1: PChar;
    S: string;
  begin
    List.BeginUpdate;
    try
      List.Clear;
      P := PChar(Value);
      while P^ <> #0 do
      begin
        if P^ = '"' then
          S := AnsiExtractQuotedStr(P, '"')
        else
        begin
          P1 := P;
          while (P^ <> #0) and (P^ <> '&') do
            P := CharNext(P);
          SetString(S, P1, P - P1);
        end;
        List.Add(S);
        if P^ = '&' then
        begin
          P := CharNext(P);
          if P^ = #0 then
            List.Add('');
        end;
      end;
    finally
      List.EndUpdate;
    end;
  end;

  function MyIndexOfName(const Name: string): Integer;
  var
    P: Integer;
    S: string;
  begin
    for Result := 0 to List.Count - 1 do
    begin
      S := List.Strings[Result];
      P := AnsiPos('=', S);
      if (P <> 0) and (AnsiCompareStr(Copy(S, 1, P - 1), Name) = 0) then Exit;
    end;
    Result := -1;
  end;

  function MyGetValue(const Name: string): string;
  var
    I: Integer;
  begin
    I := MyIndexOfName(Name);
    if I >= 0 then
      Result := Copy(List.Strings[I], Length(Name) + 2, MaxInt) else
      Result := '';
  end;

begin
  List := TStringList.Create;
  try
    MySetDelimitedText(QueryString);

    // use MyGetValue('param name') as needed, eg:
    // MyGetValue('Called')
    // MyGetValue('ToState')
    // MyGetValue('CallerCountry')
    // MyGetValue('Direction')
    // MyGetValue('CallerState')
    // MyGetValue('ToZip')
    // MyGetValue('CallSid')
    // MyGetValue('To')
    // MyGetValue('CallerZip')
  finally
    List.Free;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...