java - 如何序列化请求?

标签 java rest request jax-rs

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

        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、 header 、有效负载)并序列化该类的实例。

一个例子:

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));
        }

    }

}

关于java - 如何序列化请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48401872/

相关文章:

request - 预检请求不允许 POST 方法后,浏览器仍发送 HTTP POST 请求

Python 请求 HTTP 响应 406

java - 在 Mockito 中解析

spring - 我的api/登录帖子在Spring安全的Grails 3上遭到未授权

java - 完全相同的代码(使用多线程)无法在两台不同的计算机上运行

iphone - iOS - 如何使 tableview 使用分页 API 输出?

java - 如何在 POSTMAN 中运行自动化测试用例时将文件上传到 REST API 的请求调用中

node.js - 如何在 node.js 中发布内容类型为 ='application/x-www-form-urlencoded' 的数据

java - 无法验证 Quickbook API

java - 在 MainActivity 中存储包含附加内容的 bundle