2015-01-05 6 views
1

델파이 2007에서 JS 웹 API를 호출하고 JSON을 반환해야합니다. TRestClient를 사용하여 RAD Studio XE 5에서이 작업을 수행 할 수 있습니다. 델파이 2007 프로그램에서 호출 할 수 있도록 DLL에 넣으려고했습니다. 그러나 성공하지 못했습니다. 델파이 2007을 사용하여 이것을 어떻게 할 수 있습니까? (= TRESTResponse.Create 무기 호 : 여기에 편집델파이 2007에서 ASP 웹 API를 호출하고 JSON을 반환하는 방법

내가 델파이 XE에서 할 노력하고있어 5

class function TSampleApp.Hello(AModel: TModel): Integer; 
var 
    aRestClient: TRESTClient; 
    aRestRequest: TRESTRequest; 
    aRestResponse: TRESTResponse; 
    aParam: TRESTRequestParameter;  
    jValue: TJSONValue; 
    jObject: TJSONObject; 
begin 
    Result := -1; 
    aRestClient := TRESTClient.Create(nil); 
    try 
    aRestResponse := TRESTResponse.Create(nil); 
    try 
     aRestRequest := TRESTRequest.Create(nil); 
     try 
     try   
      aRestClient.BaseURL := 'http://localhost:49272/api/test'; 
      aRestRequest.Client := aRestClient; 
      aRestRequest.Response := aRestResponse; 
      aRestRequest.Method := rmPOST; 
      aRestRequest.Resource := 'hello'; 
      aParam := aRestRequest.Params.AddItem; 
      aParam.Kind := pkREQUESTBODY; 
      aParam.name := 'helloData'; 
      aParam.Value := TJson.ObjectToJsonString(AModel); 

      aRestRequest.Execute; 

      jValue := aRestResponse.JSONValue; 
      jObject := TJSONObject.ParseJSONValue(jValue.ToString) as TJSONObject; 
      Result := StrToIntDef((jObject.Get('status').JsonValue as TJSONString).Value, -1); 
     finally 
      FreeAndNil(jObject); 
      FreeAndNil(jValue); 
     end; 
     finally 
     FreeAndNil(aRestRequest); 
     end; 
    finally 
     FreeAndNil(aRestResponse); 
    end; 
    finally 
    FreeAndNil(aRestClient); 
    end; 
end; 

이 코드는 Win32 응용 프로그램에서 완벽하게 실행되지만 aRestResponse "실패 무엇); " 언제 dll에 넣어.

+0

정확히 무엇을 시도 했습니까? 정확히 당신에게 효과가 없었던 것은 무엇입니까? 도움이 필요한 경우 특정 세부 정보를 제공해야합니다. –

+1

Indy가 잘 작동해야합니다. JSON을 Superobjects Lib 또는 그와 비슷한 것으로 파싱해야합니다. 폼에 TIDHTTP 구성 요소를 놓거나 인스턴스화하십시오. -> str : = TIDHTTP.get (** resturl ***) –

+0

@Remy 늦게 답변을 드려 죄송합니다. 샘플 코드로 내 질문을 업데이트했습니다. – Reynaldi

답변

1

델파이 2007에서 휴식 클라이언트 솔루션을 찾지 못했습니다.이 문제로 인해 indy를 사용하게됩니다. json을 처리하기 위해 LkJson을 사용합니다.

class function TSampleApp.Hello(AModel: TModel): Integer; 
var 
    idHttp: TIdHTTP; 
    url, sjsonresponse, sjsonrequest: string; 
    strRequest: TStrings; 
    jsonObj: TlkJSONobject; 
begin 
    Result := -1; 
    url := 'http://localhost:49272/api/test/hello'; 
    idHttp := TIdHTTP.Create; 
    try 
    jsonObj := TlkJSONobject.Create; 
    try 
     //populate 
     jsonObj.Add('param1', AModel.param1); 
     jsonObj.Add('param2', AModel.param2); 
     sjsonrequest := TlkJSON.GenerateText(jsonObj); 
    finally 
     FreeAndNil(jsonObj); 
    end; 

    idHttp.Request.Accept := 'application/json'; 
    strRequest := TStringList.Create; 
    try 
     strRequest.Values['helloData'] := sjsonrequest; 
     sjsonresponse := idHttp.Post(url, strRequest); 
    finally 
     FreeAndNil(strRequest); 
    end; 

    jsonObj := TlkJSON.ParseText(sjsonresponse) as TlkJSONobject; 
    try 
     Result := StrToIntDef(VarToStr((jsonObj.Field['status'] as TlkJSONnumber).Value), -1); 
    finally 
     FreeAndNil(jsonObj); 
    end; 
    finally 
    idHttp.Free; 
    end; 
end; 

이 코드는 dll에서도 작동합니다.