2016-02-29 69 views

回答

5

與11.5.1開始有內置的支持,以可控的方式使用REST Web服務。但既然你不在那個版本上,我現在將保留爲

除非升級是一種選擇,你可以做幾件事情:

呼叫一個OS程序HTTP像捲曲或wget的

如何做到這一點正是將取決於選擇的效用,操作系統版本等等。還有人建議os更新可能會改變行爲。

此外,你應該看看錯誤重定向等之前這樣做。調用OS會創建第二個進程,因此可能會影響系統資源。只有在考慮到這些因素的情況下才能使用。

另一方面它很容易和快速。 Curl也非常靈活,並且可以幫助您使用任何標題或其他內容。

您也可以直接調用curl庫來代替。請注意,在這種情況下,您將嚴重依賴mempointers和其他c-like結構!

PROCEDURE curl: 
    DEFINE INPUT PARAMETER pcUrl  AS CHARACTER NO-UNDO. 
    DEFINE OUTPUT PARAMETER pcResponse AS LONGCHAR NO-UNDO. 

    DEFINE VARIABLE cCommand AS CHARACTER NO-UNDO. 

    /* -s is for silent use - show no errors or feedback on the screen */ 
    cCommand = "curl -s " + pcUrl + " > /tmp/curl.txt". 

    OS-COMMAND NO-CONSOLE VALUE(cCommand). 

    COPY-LOB FROM FILE "/tmp/curl.txt" TO pcResponse . 
END. 

DEFINE VARIABLE lc AS LONGCHAR NO-UNDO. 

run curl("http://www.google.com/", OUTPUT lc). 

MESSAGE STRING(SUBSTRING(lc,1,100)) VIEW-AS ALERT-BOX. 

使用.NET類

我在.net中沒有的知識,所以我不能幫你這個代碼。您將不得不研究如何在.Net中調用Web服務,然後將其「翻譯」爲ABL。這僅適用於Windows - 進程不支持Mono或其他操作系統中的.net。

推出自己的使用套接字

從無恥被盜例如:Progress Knowledgebase

DEFINE VARIABLE vcHost  AS CHARACTER INITIAL "localhost" NO-UNDO. 
DEFINE VARIABLE vcPort  AS CHARACTER INITIAL "8080"  NO-UNDO. 
DEFINE VARIABLE vhSocket AS HANDLE        NO-UNDO. 


CREATE SOCKET vhSocket. 
vhSocket:CONNECT('-H ' + vcHost + ' -S ' + vcPort) NO-ERROR. 

IF vhSocket:CONNECTED() = FALSE THEN 
DO: 
    MESSAGE "Connection failure" VIEW-AS ALERT-BOX. 

    MESSAGE ERROR-STATUS:GET-MESSAGE(1) VIEW-AS ALERT-BOX. 
    RETURN. 
END. 
ELSE 
    MESSAGE "Connect" 
     VIEW-AS ALERT-BOX. 

vhSocket:SET-READ-RESPONSE-PROCEDURE('getResponse'). 
/* supposes there is an webspeed app called yourapp.w that receives param1, param2, param3 */ 
RUN PostRequest (
    INPUT '/scripts/cgiip.exe/WService=wsbroker1/yourApp.w', 
    INPUT 'param1=value&param2=value&param3=value' 
    ). 

WAIT-FOR READ-RESPONSE OF vhSocket. 
vhSocket:DISCONNECT() NO-ERROR. 
DELETE OBJECT vhSocket. 
QUIT. 

PROCEDURE getResponse: 
    DEFINE VARIABLE vcWebResp AS CHARACTER  NO-UNDO. 
    DEFINE VARIABLE lSucess  AS LOGICAL   NO-UNDO. 
    DEFINE VARIABLE mResponse AS MEMPTR   NO-UNDO. 

    IF vhSocket:CONNECTED() = FALSE THEN do: 
     MESSAGE 'Not Connected' VIEW-AS ALERT-BOX. 
     RETURN. 
    END. 
    lSucess = TRUE. 

    DO WHILE vhSocket:GET-BYTES-AVAILABLE() > 0: 

     SET-SIZE(mResponse) = vhSocket:GET-BYTES-AVAILABLE() + 1. 
     SET-BYTE-ORDER(mResponse) = BIG-ENDIAN. 
     vhSocket:READ(mResponse,1,1,vhSocket:GET-BYTES-AVAILABLE()). 
     vcWebResp = vcWebResp + GET-STRING(mResponse,1). 
    END. 
    /* 
    *PUT HERE THE CODE TO MANIPULATE THE ANSWER 
    */ 

END. 
PROCEDURE PostRequest: 
    DEFINE VARIABLE vcRequest  AS CHARACTER. 
    DEFINE VARIABLE mRequest  AS MEMPTR. 
    DEFINE INPUT PARAMETER postUrl AS CHAR. 
    /* URL that will send the data. It must be all the path after the server. IE:/scripts/cgiip.exe/WService=wsbroker1/myApp.htm */ 
    DEFINE INPUT PARAMETER postData AS CHAR. 
    /* Parameters to be sent in the format paramName=value&paramName=value&paramName=value */ 
    vcRequest = 
     'POST ' + 
     postUrl + 
     ' HTTP/1.0~r~n' + 
     'Content-Type: application/x-www-form-urlencoded~r~n' + 
     'Content-Length:' + string(LENGTH(postData)) + 
     '~r~n' + '~r~n' + 
     postData + '~r~n'. 

    MESSAGE vcREquest 
     VIEW-AS ALERT-BOX. 

    SET-SIZE(mRequest)   = 0. 
    SET-SIZE(mRequest)   = LENGTH(vcRequest) + 1. 
    SET-BYTE-ORDER(mRequest)  = BIG-ENDIAN. 
    PUT-STRING(mRequest,1)  = vcRequest . 

    vhSocket:WRITE(mRequest, 1, LENGTH(vcRequest)). 
END PROCEDURE.