我很难在预期400时访问Restlet客户端响应的JSON表示。
任何400响应都会作为例外返回。我无法从异常中获取JSON。有什么想法吗?
代码:
public def run(Object testCaseData) {
ClientResource clientResource = RestAPIUtils.setClientResource(GroovyUtils.getDataValue(testCaseData, 'command').toString(), partnerAPICredential)
def JSONData = JSONUtils.createJSONObject(testCaseData)
Representation representation = RestAPIUtils.getRepresentation(JSONData)
try {
clientResource.post(representation).getText()
}
catch (Exception ex) {
println ex
}
}
例如,如果我通过SoapUI运行相同的请求,我会看到以下JSON表示:
{"errors": [{
"code": "VALUE_INVALID",
"field": "type",
"description": "Field value is invalid."
}]}
我无法从当前的代码中获取此信息。
答案 0 :(得分:1)
环顾四周后,我注意到clientResource对象确实包含JSON表示。以下是更新后的代码:
public def run(Object testCaseData) {
ClientResource clientResource = RestAPIUtils.setClientResource(GroovyUtils.getDataValue(testCaseData, 'command').toString(), partnerAPICredential)
def JSONData = JSONUtils.createJSONObject(testCaseData)
Representation representation = RestAPIUtils.getRepresentation(JSONData)
try {
clientResource.post(representation).getText()
}
catch (Exception ex) {
clientResource.response.entityAsText
}
}
在这种情况下,我需要返回'clientResource.response.entityAsText'对于所有可能在某一天遇到此问题的java用户,您需要返回:'clientResource.getResponse()。getEntityAsText()'
答案 1 :(得分:0)
已修改:您可以查看以下链接以获取更多详细信息:https://templth.wordpress.com/2015/02/27/exception-handling-with-restlet/。
事实上,自版本2.3以来,Restlet为此引入了带注释的异常的概念。这伴随着Restlet的经典注释接口。
例如,如果要将返回联系人的请求映射到bean Contact
。你可以使用类似的东西:
public interface MyService {
@Post
Contact addContact(Contact contact);
}
您可以在此上下文中使用自定义异常并抛出这些异常,如下所述:
public interface ContactResource {
@Post
Contact addContact(Contact contact) throws MyValidationException;
}
此异常可以使用注释Status
。如下所述:
@Status(value = 400, serialize = true)
public class MyValidationException extends RuntimeException {
public ServiceValidationException(String message, Exception e) {
super(message, e);
}
}
由于Restlet的转换器功能,此异常可以在服务器端抛出并在响应中作为bean(使用其字段)序列化。您可以注意到我们可以将用户字段添加到自定义例外。
例如,在这里,我们可以有这样的JSON内容:
{
"message": "my validation message"
}
在客户端,当收到响应时,将抛出此异常,并在异常字段中反序列化响应内容(例如我们的JSON内容)。
所以我们将得到以下代码:
ClientResource cr = new ClientResource("http://...);
ContactResource contactResource = cr.wrap(ContactResource.class);
try {
Contact newContact = new Contact();
newContact.setName("my name");
Contact addedContact = contactResource.addContact(newContact);
} catch(MyValidationException ex) {
String errorMessage = ex.getMessage();
}
在您的上下文中,异常的代码就是这样的:
@Status(value = 400, serialize = true)
public class MyValidationException extends RuntimeException {
private List<ValidationError> errors;
public ServiceValidationException() {
this.errors = new ArrayList<ValidationError>();
}
public ServiceValidationException(String message, Exception e) {
super(message, e);
this.errors = new ArrayList<ValidationError>();
}
public List<ValidationError> getErrors() {
return errors;
}
public void addError(String code, String field, String description) {
ValidationError error = new ValidationError();
error.setCode(code);
error.setField(field);
error.setDescription(description);
this.errors.add(error);
}
(...)
}
public class ValidationError {
private String code;
private String field;
private String description;
// Getters and setters
(...)
}
注意强>
您还可以选择注释以使用带注释的接口/例外并直接处理表示,如下所述:
ClientResource clientResource = (...)
JSONObject jsonObj = (...)
try {
Representation repr = clientResource.post(new JsonRepresentation(jsonObj));
(...)
}
catch (ResourceException ex) {
Representation responseRepresentation = clientResource.getResponseEntity();
JsonRepresentation jsonRepr
= new JsonRepresentation(responseRepresentation);
JSONObject errors = jsonRepr.getJsonObject();
(...)
}
希望它有所帮助, 亨利