如何从 HttpServletRequest 创建 okhttp3 请求?

How to create a okhttp3 Request from an HttpServletRequest?

当我的 Java Web 应用程序接收到 HTTP POST 请求时,它需要从 HttpServletRequest 创建一个新的 OkHttp3 请求并将其发送到另一个 URL。原始 post 请求可以是简单的表单数据或多部分。

这是我要实现的界面:

import okhttp3.Request;

public interface OkHttp3RequestBuilder {
    Request create(HttpServletRequest request);
}

看来挑战归结为我将如何创建 okhttp3.RequestBody。这是实现的相关部分...

    final HttpUrl targetUrl = HttpUrl.get("http://internal.xyz.com");

    final RequestBody requestBody = // ?????
    final Request httpRequest = new Request.Builder()
            .post(requestBody)
            .url(targetUrl)
            .build();
    return httpRequest;

我该怎么做?有什么建议么?谢谢!

这应该可以,但是 request.getReader() 一定没有调用过,因为您只能调用一次。

Request create(HttpServletRequest request) 
{

    final HttpUrl targetUrl = HttpUrl.get("http://internal.xyz.com");

    final String originalBody = request.getReader().lines().collect (Collectors.joining (System.lineSeparator()));

    final RequestBody requestBody = RequestBody.create(MediaType.parse(request.getContentType()), originalBody);


    final Request httpRequest = new Request.Builder()
            .post(requestBody)
            .url(targetUrl)
            .build();
    return httpRequest;
}

感谢您的回答,ETL!这似乎对我有用:

@Override
public RequestBody getRequestBody(final HttpServletRequest httpServletRequest) throws IOException {

    final InputStream inputStream = httpServletRequest.getInputStream();

    final byte[] requestBodyBytes = ByteStreams.toByteArray(inputStream);

    final String contentType = httpServletRequest.getContentType();

    final MediaType mediaType = MediaType.parse(contentType);

    final RequestBody requestBody = RequestBody.create(mediaType, requestBodyBytes);

    return requestBody;
}