用于Restlet客户端的HTTP 400的JSON表示

时间:2015-02-18 17:25:05

标签: json groovy restlet

我很难在预期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."
    }]}

我无法从当前的代码中获取此信息。

2 个答案:

答案 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();
    (...)
}

希望它有所帮助, 亨利