open.mapquestapi.com 上的 4GL GET 请求进度
Progress 4GL GET request on open.mapquestapi.com
我在调用 open.mapquestapi.com 以获取某些地理位置数据时使用正确的 GET 方法时遇到了严重问题。
我的代码很标准,大部分来自 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.
这部分代码 returns 消息 "Connect" 所以我相信我已正确连接。
下一部分:
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
连接:关闭
如您所见,大部分代码取自互联网上的 Progress 文档和示例。我尝试以各种方式修改我的 GET 请求,但没有成功。我还尝试了一些不同的代码,但我认为其中一个是正确解决方案的指南。预期结果应与此站点类似:Geo location request. Some short documentation about this API can be found HERE。
此代码在 UNIX 服务器上将是 运行,因此我无法使用 .NET 库。
任何帮助将不胜感激。
编辑:
请记住,关键参数中显示的哈希值将很快被删除!您应该在 business.mapquest.com .
免费生成您自己的密钥
假设您使用的是最新版本的 Progress OpenEdge (11.5+),您可以使用 OpenEdge.Net.pl(也可在 Unix 上使用)创建请求,以下(运行 on 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代码和套接字进行通信。
我在调用 open.mapquestapi.com 以获取某些地理位置数据时使用正确的 GET 方法时遇到了严重问题。 我的代码很标准,大部分来自 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.
这部分代码 returns 消息 "Connect" 所以我相信我已正确连接。 下一部分:
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 连接:关闭
如您所见,大部分代码取自互联网上的 Progress 文档和示例。我尝试以各种方式修改我的 GET 请求,但没有成功。我还尝试了一些不同的代码,但我认为其中一个是正确解决方案的指南。预期结果应与此站点类似:Geo location request. Some short documentation about this API can be found HERE。 此代码在 UNIX 服务器上将是 运行,因此我无法使用 .NET 库。 任何帮助将不胜感激。
编辑: 请记住,关键参数中显示的哈希值将很快被删除!您应该在 business.mapquest.com .
免费生成您自己的密钥假设您使用的是最新版本的 Progress OpenEdge (11.5+),您可以使用 OpenEdge.Net.pl(也可在 Unix 上使用)创建请求,以下(运行 on 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代码和套接字进行通信。