使用Grails 3.0.9,并在gradle.build
中使用此代码段获取最新鲜的REST API:
compile 'org.grails:grails-datastore-rest-client:4.0.7.RELEASE', {
['commons-codec', 'grails-async', 'grails-core',
'grails-plugin-converters', 'grails-web', 'groovy'].each {
exclude module: it
}
}
我正在尝试发出以下POST请求:
def rest = new RestBuilder(headers:["X-LSS-Env":"devmo"], connectTimeout:10000, readTimeout:20000)
response = rest.post("http://..../..") {
accept "application/json"
contentType "application/json"
json jsonBuilder
}
现在,POST接收器获得json好了,回复好了,但这就是问题:它接收标题为空地图或null
!
那么,将标题数据传递给POST接收器的正确方法是什么?这是必需的,因为环境密钥X-LSS-Env
可以具有不同的值,这指示接收器基于它进行进一步的路由。当然,与GET请求相同。
*更新*
我的POST请求的使用者实际上是一个在Apache Tomcat/8.0.26
上运行的Java应用程序。这是服务在另一方面的表现:
private javax.servlet.http.HttpServletRequest hsr;
@POST
@Path("/na")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response postSomething(Ggfp ggfp ){
try {
Enumeration<String> hnames = hsr.getHeaderNames();
int i = 0;
while (hnames.hasMoreElements()) {
String headerName = hnames.nextElement();
System.out.println(++i+ " headerName: " + headerName);
String val = hsr.getHeader(headerName);
System.out.println(" val: " + val);
}
String hval = hsr.getHeader("X-LSS-Env");
return Response.status(Status.OK).entity("X-LSS-Env is " + hval).build();
} catch (Exception e) {
}
}
从Postman工作中调用此服务,标识标题。从Grails应用程序调用它会导致空图 - 就像我没有发送标题!
答案 0 :(得分:0)
RestBuilder
构造函数从不喜欢我使用(或滥用)它的方式。如果超时发生,可以使用tryCatch逻辑实现我的目标。
def makePostWsr(serviceUrl, jsonBuilder) {
try {
def rest = new RestBuilder(connectTimeout:connectTimeout, readTimeout:readTimeout)
def response = rest.post("$wsUrl/$serviceUrl") {
header 'X-LSS-Env', 'devmo'
accept "application/json"
contentType "application/json"
json jsonBuilder
}
response
} catch (Exception e) {
println "== problem makePostWsr on $serviceUrl"
null
}
}