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

如何在Delphi中处理text/javascript类型的API响应(转为application/json)

解决Delphi解析iTunes API响应的问题

方法1:直接读取响应流获取内容

因为REST组件会根据返回的Content-Type判断是否填充Resp.Content,这里可以直接从响应流读取原始内容,绕过组件的自动处理逻辑:

var
  Resp: IResponse;
  Stream: TStringStream;
  JsonContent: string;
begin
  Stream := TStringStream.Create;
  try
    Resp := TRequest.New.BaseURL('https://itunes.apple.com')
              .Resource('search?term=' + EditSearch.Text)
              .Accept('application/json')
              .DataSetAdapter(MemTable)
              .get;
    
    // 重置流指针后读取内容
    Resp.ContentStream.Position := 0;
    Stream.LoadFromStream(Resp.ContentStream);
    JsonContent := Stream.DataString;
    
    // 解析JSON并加载到MemTable
    with TJSONObject.ParseJSONValue(JsonContent) as TJSONObject do
    try
      MemTable.LoadFromJSON(ToString);
    finally
      Free;
    end;
  finally
    Stream.Free;
  end;
end;

方法2:强制让REST组件识别响应为JSON

通过自定义响应拦截器,修改响应的Content-Type为application/json,让组件正常解析内容:

type
  TJSONResponseInterceptor = class(TInterfacedObject, IRESTResponseInterceptor)
  public
    procedure ProcessResponse(AResponse: TRESTResponse);
  end;

procedure TJSONResponseInterceptor.ProcessResponse(AResponse: TRESTResponse);
begin
  // 强制修改Content-Type,触发组件的JSON解析逻辑
  AResponse.ContentType := 'application/json';
end;

// 使用示例
var
  Client: TRESTClient;
  Request: TRESTRequest;
  Resp: TRESTResponse;
begin
  Client := TRESTClient.Create('https://itunes.apple.com');
  Request := TRESTRequest.Create(nil);
  Resp := TRESTResponse.Create(nil);
  try
    Request.Client := Client;
    Request.Response := Resp;
    Request.Resource := 'search?term=' + EditSearch.Text;
    Request.Accept := 'application/json';
    
    // 添加拦截器
    Client.ResponseInterceptors.Add(TJSONResponseInterceptor.Create);
    
    Request.Execute;
    
    // 此时Resp.Content已正常填充,直接加载到MemTable
    if Resp.Content <> '' then
      MemTable.LoadFromJSON(Resp.Content);
  finally
    Resp.Free;
    Request.Free;
    Client.Free;
  end;
end;

方法3:使用THTTPClient直接请求(最简洁)

绕过REST组件的限制,用Delphi自带的THTTPClient直接获取响应文本,不受Content-Type影响:

var
  HTTPClient: THTTPClient;
  JsonContent: string;
begin
  HTTPClient := THTTPClient.Create;
  try
    HTTPClient.DefaultHeaders.Accept := 'application/json';
    // 直接获取响应文本,忽略Content-Type的标识问题
    JsonContent := HTTPClient.Get('https://itunes.apple.com/search?term=' + EditSearch.Text).ContentAsString;
    
    // 直接加载到MemTable
    MemTable.LoadFromJSON(JsonContent);
  finally
    HTTPClient.Free;
  end;
end;

三种方法各有适用场景:方法3适合快速实现,代码最简洁;方法1、2适合需要沿用原有REST组件架构的场景。

内容的提问来源于stack exchange,提问作者André D Palhares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:20