如何从HttpServletRequest创建okhttp3请求?

5
当我的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;

我该如何做到这一点?有什么建议吗?谢谢!

2个回答

1

这应该可以工作,但是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;
}

1
感谢您的回答,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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接