添加REST响应的链接

时间:2011-03-08 17:20:13

标签: java xml rest xml-serialization xsd

我有REST服务,可以使用未编组的域实体进行响应。例如:

Request:
GET http://someAddress.com/customer/001

Response:
<customer>
    <id>001</id>
    <name>Some Guy</name>
    ...
</customer>

我想为发现服务的响应添加一些链接。例如:

<customer>
    <id>001</id>
    <name>Some Guy</name>
    ...
    <link xml:link="delete" href="http://someAddress.com/customer/001"/>
</customer>

我担心的是,这是否会导致编组问题。我希望链接可被发现,但我希望消费者能够轻松使用域模式,其中不包含链接元素。

将回复链接放在其他地方是否更好?如果是这样,在哪里?

2 个答案:

答案 0 :(得分:1)

假设您正在使用JAXB作为对象到XML层,您可以使用XmlAdapter执行以下操作,但是不需要String,您需要一个Link对象:

import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CustomerAdapter  extends XmlAdapter<String, Customer>{

    private JAXBContext jaxbContext;

    public CustomerAdapter() {
        try {
            jaxbContext = JAXBContext.newInstance(Customer.class);
        } catch(JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String marshal(Customer v) throws Exception {
        if(null == v) {
            return null;
        }
        return "http://someAddress.com/customer/" + v.getId();
    }

    @Override
    public Customer unmarshal(String v) throws Exception {
        if(null == v) {
            return null;
        }

        URL url = new URL(v);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Accept", "application/xml");

        Customer customer = (Customer) jaxbContext.createUnmarshaller().unmarshal(connection.getInputStream());
        connection.disconnect();
        return product;
    }

}

有关XmlAdapter的更多信息,请参阅:

答案 1 :(得分:0)

如果您确实不想更改模式以支持link元素,那么您可以使用链接标头。 http://tools.ietf.org/html/rfc5988