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

