0

IdHTTP を使用して、Delphi XE2 でこの curl 操作 (動作することが知られている) を等価にしようとしています:

 curl http://hub.Healthdata.gov/api/action/datastore_search --data-urlencode '
 {
  "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",
  "filters": {
    "provider_id": 393303
   }
   }'

次のコードを試しましたが、うまくいきません...正しい手順について誰かアドバイスできますか? 悪い要求を返します。ありがとうございました。

procedure TfrmMain.get1Click(Sender: TObject);
var
  lHTTP: TIdHTTP;
  lParamList: TStringList;
  result:string;

begin
  lParamList := TStringList.Create;
  lParamList.Add('"resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54"');
  lParamList.Add('"filters": {"provider_id": 393303}');

  lHTTP := TIdHTTP.Create(nil);
  try
    Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search --data-urlencode ',
     lParamList);
  finally
    FreeAndNil(lHTTP);
    FreeAndNil(lParamList);
  end;
end;
4

2 に答える 2

2

パラメータは URL の一部ではありません。--data-urlencodeポストされるデータをエンコードする方法を curl に指示するだけなので、その部分をまったく渡さないでくださいTIdHTTP

一重引用符で囲まれた curl コマンドの部分は、投稿する実際のデータです。 HTTPメソッド、コンテンツ タイプ、およびデータの URL エンコードを--data-urlencode使用してデータを送信するように curl に指示します。POSTapplication/x-www-form-urlencoded

TStringsバージョンはTIdHTTP.Post()そのすべてを行います。通常、application/x-www-form-urlencoded「name=value」文字列ペアで使用されますが、curl コマンドでは名前は指定されておらず、値のみが指定されています。curl がデフォルト名を提供する場合、Delphi コードは次のようになります。

procedure TfrmMain.get1Click(Sender: TObject);
var
  json: string;
  lHTTP: TIdHTTP;
  lParamList: TStringList;
  result:string;
begin
  json := CRLF +
          '{' + CRLF +
          ' "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",' + CRLF +
          ' "filters": {' + CRLF +
          '   "provider_id": 393303' + CRLF +
          ' }' + CRLF +
          '}';
  lParamList := TStringList.Create;
  try
    lParamList.Add('somename='+json);
    lHTTP := TIdHTTP.Create(nil);
    try
      Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search', lParamList);
    finally
      lHTTP.Free;
    end;
  finally
    lParamList.Free;
  end;
end;

それ以外の場合、curl が指定されたデータをそのまま送信する場合、Delphi コードは次のようになります。

procedure TfrmMain.get1Click(Sender: TObject);
var
  json: string;
  lHTTP: TIdHTTP;
  lParamList: TStringList;
  result:string;
begin
  json := CRLF +
          '{' + CRLF +
          ' "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",' + CRLF +
          ' "filters": {' + CRLF +
          '   "provider_id": 393303' + CRLF +
          ' }' + CRLF +
          '}';
  lParamList := TStringList.Create;
  try
    lParamList.Add(json);
    lHTTP := TIdHTTP.Create(nil);
    try
      Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search', lParamList);
    finally
      lHTTP.Free;
    end;
  finally
    lParamList.Free;
  end;
end;

唯一の違いは、どのパラメータ値が に渡されるかTStringList.Add()です。

于 2013-04-10T19:19:06.360 に答える