Прогресс 4GL GET запрос на open.mapquestapi.com - PullRequest
0 голосов
/ 06 сентября 2018

У меня серьезная проблема с правильным методом GET, вызывающим 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.

Resposne с веб-сервера: HTTP / 1.1 400 BAD_REQUEST Длина контента: 0 Соединение: Закрыть

Как видите, большая часть кода взята из документов и примеров Progress, найденных в Интернете. Я пытался изменить мой запрос GET различными способами, но безуспешно. Я также попробовал какой-то другой код, но я думаю, что это руководство для правильного решения. Ожидаемый результат должен быть таким, как на этом сайте: Запрос географического местоположения . Краткая документация по этому API может быть найдена ЗДЕСЬ . Этот код будет работать на сервере UNIX, поэтому я не могу использовать библиотеки .NET. Любая помощь будет оценена.

EDIT: ПОЖАЛУЙСТА, ПОМНИТЕ, ЧТО ХАШ-ЗНАЧЕНИЕ, ПОКАЗАННОЕ В КЛЮЧЕВОМ ПАРАМЕТРЕ, БУДЕТ УДАЛЕНО ОЧЕНЬ СКОРО! ВЫ ДОЛЖНЫ СОЗДАТЬ СВОЙ КЛЮЧ БЕСПЛАТНО НА business.mapquest.com.

1 Ответ

0 голосов
/ 06 сентября 2018

Если вы используете последнюю версию 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 и сокеты для связи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...