#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 (некоторые вещи не сработали), но использование части вашего кода выполняется нормально. Спасибо.