OSB 12c调用带JSON请求体的GET REST服务问题求助
在OSB 12c中调用带JSON请求体的GET REST服务的可行方案
确实有开发者成功实现过这类调用,分享两个经过验证的方案,针对你遇到的问题逐一解决:
方案一:调整HTTP代理服务+管道配置
你的第二种方法方向没错,但细节没处理好导致408错误,调整如下:
- 创建HTTP代理服务:
传输类型选HTTP,内容类型直接设为application/json(别用text/plain,避免头信息不匹配),填入目标服务URL后,暂时将请求方法设为POST。 - 管道内修正请求信息:
- 在请求管道添加
Transport Header操作,把Request Method强制改成GET; - 保留
Content-Type: application/json头,必须手动添加Content-Length头,值为JSON请求体的字节长度(可通过XQuery计算:string-length($body),纯英文场景直接用字符串长度,含中文则需按UTF-8字节数换算); - 禁用
Transfer-Encoding: chunked头,多数服务不接受GET请求用分块传输,OSB默认可能自动添加该头,必须手动移除。
- 在请求管道添加
- 请求体处理:管道中直接传递原始JSON请求体,不做额外转换,确保OSB不会自动丢弃请求体。
调整后可用抓包工具(如Wireshark)验证:请求方法为GET、头信息正确、请求体正常发送,即可解决之前的请求体为空和408问题。
方案二:Java Callout绕过OSB传输层限制
如果方案一仍有问题,可通过Java直接发起请求,完全绕过OSB对GET请求的默认限制:
- 编写HTTP工具类:用
HttpURLConnection构造带请求体的GET请求,示例代码:import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class GetWithBodySender { public static String send(String targetUrl, String jsonPayload) throws Exception { URL url = new URL(targetUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); // 写入JSON请求体 try (OutputStream os = conn.getOutputStream()) { byte[] input = jsonPayload.getBytes("UTF-8"); os.write(input, 0, input.length); } // 读取目标服务响应 StringBuilder response = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) { String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } } return response.toString(); } } - 部署并调用:将编译好的JAR包放入OSB域的
lib目录,重启OSB服务;在管道中添加Java Callout操作,调用该类的send方法,传入目标URL和JSON请求体,最后将返回的字符串转换为OSB可处理的响应格式即可。
额外提醒
- 检查OSB配置:部分版本会默认丢弃GET请求的请求体,需确保传输层无此类过滤规则;
- 408错误排查:多为请求头不完整(如缺失
Content-Length)或连接超时,抓包确认发送的请求是否符合目标服务要求; - 测试方式:不要仅依赖OSB测试控制台,用Postman或curl直接调用OSB代理服务,验证请求转发是否正常。
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

