如何在 REST Web 服务中传递自定义对象

问题描述 投票:0回答:3

我在将自定义对象传输给客户端时遇到问题。如何将自定义对象传输到客户端并将其接收回网络服务?我正在按块传输文件。我想知道我应该如何写我的客户。我尝试在客户端中将其作为

MediaType.APPLICATION_JSON
传递,但没有得到任何结果,这意味着它不会传递回网络服务。下面是我正在处理的一些代码。

网络服务

 @POST
    @Path("/fileTransfer")
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_JSON})
    public final TransferInfomation transferInfo(final FileModel file)
{
...
}

...(一些代码)(我们只说一个syso

文件模型类

public class FileModel {

private String fileID;
private DataHandler dataHandler;

/**
 * Constructor.
 */
public FileModel() {
}

(假设已经制作了 setter 和 getter)

(不确定网络服务是否正确)。还在学习 REST,我想知道客户端应该如何。

web-services rest jersey jersey-client
3个回答
3
投票

在 Jersey 中“编组”和“解编”“自定义对象”(JSON、XML 等)的一个好方法是使用 JAXB (https://jaxb.java.net/)。

为此,您需要创建一个“jaxb 类”,并具有适当的 getter 和 setter(以及注释),例如:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class FileModel{

    private String fileID;
    private DataHandler dataHandler;

    public String getFileID(){
        return fileID;
    }

    public void setFileID(String fileID){
        this.fileID = fileID;
    }

    public DataHandler getDataHandler(){
        return dataHandler;
    }

    public void setDataHandler(DataHandler dataHandler){
        this.dataHandler = dataHandler;
    }

}

不要忘记声明

@XmlRootElement
。然后您可以简单地在 API 端点(方法)中声明和使用这些对象:

@POST
@Path("/fileTransfer")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public final FileModel transferInfo(FileModel file)
{
    // read file in "FileModel" format
    // ... make several operations
    // return new FileModel (or another format if you will)
}

这应该有效。确保在客户端正确遵循为 FileModel 定义的数据结构。请参阅此处有关如何在 Jersey 中处理该问题的示例:How do I POST a Pojo with Jersey Client而不手动转换为 JSON?(其中还使用了 JAXB)。


2
投票

您的 REST 端点表明您想要使用和生成 JSON。所以REST客户端需要发送可以反序列化为

FileModel
的JSON,而
TransferInfomation
返回的
transferInfo
需要序列化为JSON才能返回给客户端。

通常,Java REST 框架(如 RESTEasyRestletCamelSpring MVC)提供了一些工具,可让您定义 JSON 序列化器/反序列化器(如 Jackson)以及来自 JSON <--> Java 的映射规则,以及框架会为您处理细节。

因此,如果您使用这些框架之一,您只需将它们配置为使用首选 JSON 工具并定义规则即可。


0
投票

您可以像下面这样实现:

服务器端:

@PUT
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addRecord(CustomClass mCustomClass)
{
    ///
    ///
    ///
    return "Added successfully : "+CustomClass.getName();

}// addRecord

客户端:

public static void main(String[] args)
{
    ///
    ///
    ///
    CustomClass mCustomClass = new CustomClass();
    Client client = ClientBuilder.newClient();
    String strResult = client.target(REST_SERVICE_URL).request(MediaType.APPLICATION_XML).put(Entity.xml(mCustomClass), String.class);
}
© www.soinside.com 2019 - 2024. All rights reserved.