как создать http-сообщение с полезной нагрузкой param и json одновременно с помощью openedge RequestBuilder

#post #httpclient #openedge #progress-4gl

#Публикация #httpclient #openedge #прогресс-4gl

Вопрос:

Мне нужно отправить сообщение на URL-адрес с параметрами и полезной нагрузкой json. Например, в Postman я сделал это:

post http://address.com?key=As8941a1891389123812312381923 и в теле поместите json в формате RAW. В заголовок я просто помещаю application / json типа контента, и он работает нормально.

В openedge я попробовал это:

 oJson = new JsonObject;
oJson:add('...blablabla',payloadData).
assign cURL = 'http://address.com?key=As8941a1891389123812312381923'.
oHttpClient = ClientBuilder:Build():Client.
Assign oRequest = RequestBuilder:Post(cURL,oJson)
                  :Content-type('application/json')
                  :AcceptJson()
                  :Request.
Assign oResponse = oHttpClient:Execute(oRequest).
  

Но я получил ошибку 403 с сервера.
похоже, проблема в том, что я пытаюсь отправить параметр ?key= xxxx с URL-адресом, а также полезной нагрузкой json одновременно, или я допустил ошибку при формировании cUrl.

В других сообщениях, которые я делал (и которые работают нормально) без полезной нагрузки json, когда есть некоторые параметры, обычно мне приходится отправлять параметры отдельно, например:

 ASSIGN id = trim("db="   trim(db)   "amp;lg="   trim(lg)   "amp;sh="   trim(sh)   
"amp;sxml="        trim(argumentos)) 

htmlRequest = trim(id).
oRequestBody = new String(htmlRequest).

oRequest  = RequestBuilder:Post(trim(cURL),oRequestBody)
            :AcceptHtml()
            :Request.
oResponse = ClientBuilder:Build():Client:Execute(oRequest).
  

как отправить оба параметра «?key= ….» и полезную нагрузку json одновременно с openedge RequestBuilder?

Кто-нибудь может помочь?

Заранее спасибо

Комментарии:

1. Является ли ваша полезная нагрузка допустимой полезной нагрузкой json? Если вы установите уровень отладки равным 5, то необработанный запрос и ответы экспортируются в ваш временный каталог — сравните их с тем, что вы отправляете через Postman.

Ответ №1:

Я проверил ваш запрос — с объектом JSON и без него — и в обоих случаях строка запроса является частью POST.

Сейчас я использую OpenEdge 12.2, и результат:

 POST /?key=As8941a1891389123812312381923 HTTP/1.1
Host: address.com
Content-Type: application/json
Content-Length: 16
Accept: application/json

{"blablabla":42}
  

Вот моя процедура тестирования:

 BLOCK-LEVEL ON ERROR UNDO, THROW.

USING OpenEdge.Core.*                    FROM PROPATH .
USING OpenEdge.Net.*                     FROM PROPATH .
USING OpenEdge.Net.HTTP.*                FROM PROPATH .
USING OpenEdge.Net.HTTP.Filter.Writer.*  FROM PROPATH .
USING OpenEdge.Net.HTTP.Filter.Payload.* FROM PROPATH .
USING Progress.Json.ObjectModel.*        FROM PROPATH .

DEFINE VARIABLE oJson                    AS JsonObject NO-UNDO .
DEFINE VARIABLE cUrl                     AS CHARACTER NO-UNDO.
DEFINE VARIABLE oHttpClient              AS IHttpClient NO-UNDO .
DEFINE VARIABLE oRequest                 AS IHttpRequest NO-UNDO .
DEFINE VARIABLE oMessageBody             AS ByteBucket NO-UNDO .
DEFINE VARIABLE oBodyWriter              AS MessageWriter no-undo.
DEFINE VARIABLE cRequest                 AS CHARACTER NO-UNDO.

/* ***************************  Main Block  *************************** */

oJson = NEW JsonObject() .
oJson:Add ('blablabla', 42).
ASSIGN cURL = 'http://address.com?key=As8941a1891389123812312381923'.

oHttpClient = ClientBuilder:Build():Client.

ASSIGN oRequest = RequestBuilder:Post(cURL,oJson)
                  :ContentType('application/json')
                  :AcceptJson()
                  :Request

       oMessageBody = NEW ByteBucket()

       oBodyWriter = RequestWriterBuilder:Build(oRequest)
                            :WriteTo(oMessageBody)
                            :Writer.

oBodyWriter:Open().
/* writes the message's contents into the message body */
oBodyWriter:Write(oRequest).
oBodyWriter:Close().

cRequest = GET-STRING(oMessageBody:GetBytes():Value, 1) .

MESSAGE cRequest VIEW-AS ALERT-BOX .
  

Комментарии:

1. несмотря на то, что мой OpenEdge равен 11,6 (некоторые вещи не сработали), но использование части вашего кода выполняется нормально. Спасибо.