我正在开发一个Spring项目,实现一个简单的控制台应用程序,该应用程序必须调用一个外部REST Web服务,并向其传递一个参数并从中获取响应。
对此Web服务的调用是:
http://5.249.148.180:8280/GLIS_Registration/6
其中 6 是指定的 ID 。如果您在浏览器中打开此地址(或通过 cURL 工具),您将获得预期的错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<sampleid>IRGC 100000</sampleid>
<genus>Oryza</genus>
<error>PGRFA sampleid [IRGC 100000], genus [Oryza] already registered for this owner</error>
</response>
此错误消息是此请求的预期响应,我也使用 cURL 工具正确获取该请求。
所以我必须从Spring应用程序执行此GET请求。
为此,我将此 getResponse()方法创建为 RestClient 类:
@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RestClient {
RestTemplate restTemplate;
String uriResourceRegistrationApi;
public RestClient() {
super();
restTemplate = new RestTemplate();
uriResourceRegistrationApi = "http://5.249.148.180:8280/GLIS_Registration/7";
}
public ResponseEntity<String> getResponse() {
ResponseEntity<String> response = restTemplate.getForEntity(uriResourceRegistrationApi, String.class);
return response;
}
}
然后我从这个测试方法中调用这个方法:
@Test
public void singleResourceRestTest() {
System.out.println("singleResourceRestTest() START");
ResponseEntity<String> result = restClient.getResponse();
System.out.println("singleResourceRestTest() END");
}
但我遇到了一种非常奇怪的行为,它发生的是:
1)对外部Web服务的调用似乎发生了(我从Web服务日志中看到了它)。
2)Web服务检索具有值 7 的参数,但是似乎无法使用它完成而没有问题从浏览器或shell语句执行请求:
curl -v http://5.249.148.180:8280/GLIS_Registration/7
但是现在,以这种方式调用,我的webservice(我无法发布代码,因为它是一个WSO2 ESB流)给我这个错误信息:
<200 OK,<?xml version="1.0" encoding="UTF-8"?>
<response>
<error>Location information not correct</error>
<error>At least one between <genus> and <cropname> is required</error>
<error>Sample ID is required</error>
<error>Date is required</error>
<error>Creation method is required</error>
</response>,{Vary=[Accept-Encoding], Content-Type=[text/html; charset=UTF-8], Date=[Fri, 05 May 2017 14:07:09 GMT], Transfer-Encoding=[chunked], Connection=[keep-alive]}>
查看Web服务日志似乎使用 RestTemplate 执行调用,使用检索到的 ID = 7 执行数据库查询时会遇到一些问题。
我知道它看起来非常奇怪,您可以看到:“问题出在您的Web服务而不是Spring RestTemplate”。这只是部分正确,因为我实现了这个执行低级Http GET调用的自定义方法,这个 callWsOldStyle()(推入上一个 RestClient 类):
public void callWsOldStyle() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL restAPIUrl = new URL("http://5.249.148.180:8280/GLIS_Registration/7");
connection = (HttpURLConnection) restAPIUrl.openConnection();
connection.setRequestMethod("GET");
// Read the response
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder jsonData = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonData.append(line);
}
System.out.println(jsonData.toString());
}catch(Exception e) {
e.printStackTrace();
}
finally {
// Clean up
IOUtils.closeQuietly(reader);
if(connection != null)
connection.disconnect();
}
}
使用此方法代替RestTemplate,它可以正常工作,这一行:
System.out.println(jsonData.toString());
打印预期结果:
<?xml version="1.0" encoding="UTF-8"?><response><sampleid>IRGC 100005</sampleid><genus>Oryza</genus><error>PGRFA sampleid [IRGC 100005], genus [Oryza] already registered for this owner</error></response>
总结:
那么,这个问题的原因是什么?我错过了什么?也许可以依靠一些错误的标题或类似的东西?
答案 0 :(得分:0)
正如Pete所说,您收到内部服务器错误(状态代码500),因此您应该检查此休息服务的服务器端。
无论如何,您可以对@model Start.Models.ExternalLoginConfirmationViewModel
@using (Html.BeginForm("ExternalLoginConfirmation", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) {
@Html.AntiForgeryToken()
<hr />
<div class="form-group">
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email)
</div>
</div>
<input type="submit" />
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
resttemplate
对象if
你需要在请求中做一些事情org.springframework.web.client.RequestCallback
对象以提取数据<强> org.springframework.web.client.RequestCallback 强>
org.springframework.web.client.ResponseExtractor<String>
<强> org.springframework.web.client.ResponseExtractor 强>
public class SampleRequestCallBack implements RequestCallback
{
@Override
public void doWithRequest(ClientHttpRequest request) throws IOException
{
}
}
REST TEMPLATE CALL
public class CustomResponseExtractor implements ResponseExtractor<String>
{
private static final Logger logger = LoggerFactory.getLogger(CustomResponseExtractor.class.getName());
@Override
public String extractData(ClientHttpResponse response) throws IOException
{
try
{
String result = org.apache.commons.io.IOUtils.toString(response.getBody(), Charset.forName("UTF8"));
if( logger.isInfoEnabled() )
{
logger.info("Response received.\nStatus code: {}\n Result: {}",response.getStatusCode().value(), result);
}
return result;
}
catch (Exception e)
{
throw new IOException(e);
}
}
}
安吉洛