Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何序列化请求?_Java_Rest_Request_Jax Rs - Fatal编程技术网

Java 如何序列化请求?

Java 如何序列化请求?,java,rest,request,jax-rs,Java,Rest,Request,Jax Rs,我有下面的请求,如果在我想保存在数据库中的服务中发生错误,请求将被序列化,以便在其他时间再次发送 URI uri = fromUri(config.getUri()).path("/myservice").build(); Client client = ClientProducer.get(); response = client .target(uri) .request()

我有下面的请求,如果在我想保存在数据库中的服务中发生错误,请求将被序列化,以便在其他时间再次发送

        URI uri = fromUri(config.getUri()).path("/myservice").build();
        Client client = ClientProducer.get();

        response = client
                .target(uri)
                .request()
                .headers(obterCabecalhos())
                .accept(MediaType.APPLICATION_JSON)
                .post(Entity.json(myEntity));

        if (response.getStatus() != OK.getStatusCode()) {
            throw new TSEIntegracaoException();
             // Here I'd like to serialize the request and save in a database
        }

我认为这是不可能的。创建一个封装请求数据uri、头、负载的类,并序列化该类的实例,怎么样

例如:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.xml.bind.DatatypeConverter;

public class DemoClient {

    public static void main(String[] args) throws Exception {
        Client client = ClientBuilder.newClient();

        URI uri = URI.create("http://localhost:8000");
        Map<String, List<Object>> headers = new HashMap<>();
        headers.put(HttpHeaders.ACCEPT, Arrays.asList((Object) MediaType.APPLICATION_JSON));

        PostRequestData requestData = new PostRequestData(uri, headers, new String("hello world"));

        Response response = requestData.post(client);
        if (response.getStatus() != Status.ACCEPTED.getStatusCode()) {

            // let's serialise it into binary
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteStream);
            objectOutputStream.writeObject(requestData);
            // save bytestream or print it?
            String bin = DatatypeConverter.printHexBinary(byteStream.toByteArray());
            System.out.println(bin);

            // let's replay the request
            byte[] newBytes = DatatypeConverter.parseHexBinary(bin);
            ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(newBytes));
            PostRequestData newRequestdata = (PostRequestData) oin.readObject();

            Response newResponse = newRequestdata.post(client);

            if (newResponse.getStatus() != Status.ACCEPTED.getStatusCode()) {
                System.out.println("give up!");
            }
        }
    }

    static class PostRequestData implements Serializable {

        private static final long serialVersionUID = -5786067257552259115L;

        final URI uri;

        final Map<String, List<Object>>  headers;

        final Serializable entity; 

        public PostRequestData(URI uri, Map<String, List<Object>> headers, Serializable entity) {
            this.uri = uri;
            this.headers = headers;
            this.entity = entity;
        }

        public Response post(Client client) {
            MultivaluedHashMap<String, Object> multimap = new MultivaluedHashMap<String, Object>();
            headers.forEach((k,v) -> multimap.put(k, v));

            return client.target(uri)
                .request()
                .headers(multimap)
                .post(Entity.text(entity));
        }

    }

}

您使用的是哪种rest提供程序?我使用的是JAX-RSP类中的ClientProducer导入是什么?我认为这是不可能的。您可以创建自己的类来封装请求数据uri、头、方法、负载,并序列化该类的实例。