【问题标题】:Progress 4GL GET request on open.mapquestapi.com在 open.mapquestapi.com 上进行 4GL GET 请求
【发布时间】:2019-02-11 02:40:59
【问题描述】:

我在调用open.mapquestapi.com 以获取一些地理位置数据时遇到了一个严重的问题。 我的代码非常标准,主要取自 Progress KB 和其他网站。

DEFINE VARIABLE vcHost   AS CHARACTER INITIAL "open.mapquestapi.com" NO-UNDO.
DEFINE VARIABLE vcPort   AS CHARACTER INITIAL "80" NO-UNDO.
DEFINE VARIABLE vhSocket AS HANDLE    NO-UNDO.

CREATE SOCKET vhSocket.
vhSocket:CONNECT('-H ' + vcHost + ' -S 80')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').
RUN GetRequest.

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

PROCEDURE GetRequest:
    DEFINE VARIABLE vcRequest AS CHARACTER.
    DEFINE VARIABLE mRequest  AS MEMPTR.

vcRequest = 'GET ' +
    '/nominatim/v1' +
    '/search.php?key=WLrMQcGao56Cb5m4ulmwZZDOegO3BkZn&format=xml&q=warszawa chałubińskiego 8&addressdetails=1&limit=50' +
    " ~r~n HTTP/1.1 ~r~n" +
    "~r~nConnection: close~r~n~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.

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.

    message vcWebResp view-as alert-box.       
END.

来自网络服务器的响应是: HTTP/1.1 400 BAD_REQUEST 内容长度:0 连接:关闭

如您所见,大部分代码取自 Internet 上的 Progress 文档和示例。我试图以各种方式修改我的 GET 请求,但没有运气。我也尝试了一些不同的代码,但我认为这是正确解决方案的指南。预期结果应类似于此站点:Geo location request。可以在HERE 找到有关此 API 的一些简短文档。 此代码将在 UNIX 服务器上运行,因此我无法使用 .NET 库。 任何帮助将不胜感激。

编辑: 请记住,关键参数中显示的哈希值很快就会被删除!您应该在 business.mapquest.com 上免费生成自己的密钥。

【问题讨论】:

    标签: rest sockets geolocation openedge progress-4gl


    【解决方案1】:

    假设您使用的是最新版本的 Progress OpenEdge (11.5+),您可以使用 OpenEdge.Net.pl(在 Unix 上也可用)来创建请求,以下(在 Linux 上运行)可以帮助您入门:

    https://abldojo.services.progress.com:443/#/?shareId=5b9064d6689ac207d7375047

    USING OpenEdge.Net.HTTP.RequestBuilder.
    USING OpenEdge.Net.HTTP.ClientBuilder.
    USING OpenEdge.Net.HTTP.IHttpRequest.
    USING OpenEdge.Net.HTTP.IHttpResponse.
    USING Progress.Json.ObjectModel.JsonArray.
    
    define variable oRequest  as IHttpRequest no-undo.
    define variable oResponse as IHttpResponse no-undo.
    define variable oEntity   as Progress.Lang.Object no-undo.
    
    oRequest    =   RequestBuilder
                        :Get(
                            "http://open.mapquestapi.com"
                            + "/nominatim/v1/search.php"
                            + "?key=WLrMQcGao56Cb5m4ulmwZZDOegO3BkZn"
                            + "&q=warszawa chałubińskiego 8"
                            + "&addressdetails=1"
                            + "&limit=50"
                            + "&format=json"
                        )
                        :Request
                        .
    oResponse = ClientBuilder:Build():Client:Execute( oRequest ).
    
    oEntity = oResponse:Entity.
    
    def var lcc as longchar no-undo.
    
    cast( oEntity, JsonArray ):Write( lcc, true ).
    
    message string( lcc ).
    

    OpenEdge.Net.pl 也只是使用 ABL 代码和套接字进行通信。

    【讨论】:

    • 像魅力一样工作。非常感谢斯特凡!对于其他有同样问题的人:如果您从 .sh 脚本运行一些 .p 文件,请记住在 PROPATH 参数中添加正确的路径到 OpenEdge.Net.pl,例如:$DLC/tty/netlib/OpenEdge.Net.pl
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 2014-03-17
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多