如何使用 openedge requestBuilder 同时制作带有参数和 json 负载的 http post
how to make a http post with param and json payload at same time with openedge requestBuilder
我需要使用参数和 json 负载将 post 发送到 url。
例如,在 Postman 中,我做了这个:
post http://address.com?key=As8941a1891389123812312381923
并在 body 中将 json 设为 RAW 格式。在 header 上,我只是放了一个 Content-type application/json,它工作正常。
在 openge 中我试过这个:
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 错误。
似乎问题是当我尝试同时发送带有 URL 和 json 有效载荷的 ?key=xxxx 参数时,或者,我在 cUrl 格式中犯了一个错误。
在我制作的其他类型的 post 中(并且工作正常)没有 json 有效负载,当有一些参数时,通常我必须单独发送参数,如下所示:
ASSIGN id = trim("db=" + trim(db) + "&lg=" + trim(lg) + "&sh=" + trim(sh) +
"&sxml=" + trim(argumentos))
htmlRequest = trim(id).
oRequestBody = new String(htmlRequest).
oRequest = RequestBuilder:Post(trim(cURL),oRequestBody)
:AcceptHtml()
:Request.
oResponse = ClientBuilder:Build():Client:Execute(oRequest).
如何使用 openedge RequestBuilder 同时发送参数“?key=....”和 json 负载?
有什么body可以帮忙吗?
提前致谢
我已经检查了您的请求 - 有和没有 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 .
我需要使用参数和 json 负载将 post 发送到 url。 例如,在 Postman 中,我做了这个:
post http://address.com?key=As8941a1891389123812312381923
并在 body 中将 json 设为 RAW 格式。在 header 上,我只是放了一个 Content-type application/json,它工作正常。
在 openge 中我试过这个:
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 错误。 似乎问题是当我尝试同时发送带有 URL 和 json 有效载荷的 ?key=xxxx 参数时,或者,我在 cUrl 格式中犯了一个错误。
在我制作的其他类型的 post 中(并且工作正常)没有 json 有效负载,当有一些参数时,通常我必须单独发送参数,如下所示:
ASSIGN id = trim("db=" + trim(db) + "&lg=" + trim(lg) + "&sh=" + trim(sh) +
"&sxml=" + trim(argumentos))
htmlRequest = trim(id).
oRequestBody = new String(htmlRequest).
oRequest = RequestBuilder:Post(trim(cURL),oRequestBody)
:AcceptHtml()
:Request.
oResponse = ClientBuilder:Build():Client:Execute(oRequest).
如何使用 openedge RequestBuilder 同时发送参数“?key=....”和 json 负载?
有什么body可以帮忙吗?
提前致谢
我已经检查了您的请求 - 有和没有 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 .