Могу ли я изменить заголовки в части MultipartBody? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь отправить полезную нагрузку MultipartBody с помощью OkHttp3. Вот MWE для создания полезной нагрузки (плюс получение ее в виде строки):

MediaType JSON = MediaType.get("application/json");
RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.MIXED)
    .addPart(RequestBody.create(JSON, "{\"foo\": true, \"bar\": \"some string\"}"))
    .build();

Buffer buffer = new Buffer();
requestBody.writeTo(buffer);
String requestBodyAsString = buffer.readUtf8();

, которая автоматически добавляет заголовки, и в результате получается:

--8d863b3b-72a0-4b29-b4f4-5cc0b68d8117
Content-Type: application/json; charset=utf-8
Content-Length: 35

{"foo": true, "bar": "some string"}
--8d863b3b-72a0-4b29-b4f4-5cc0b68d8117

Сервер, против которого я отправляютребует, чтобы кодировка символов и заголовок Content-Length были удалены следующим образом:

--8d863b3b-72a0-4b29-b4f4-5cc0b68d8117
Content-Type: application/json

{"foo": true, "bar": "some string"}
--8d863b3b-72a0-4b29-b4f4-5cc0b68d8117

MultipartBody.Builder() имеет .addPart(Headers headers, RequestBody body), но я не могу использовать это для удаления заголовков или переопределения заголовка Content-Type. Есть ли способ изменить их через API OkHttp, или мне нужно было бы изменить строку полезных данных напрямую?

1 Ответ

0 голосов
/ 30 октября 2019

Вот мое взломанное решение, напрямую изменяющее полезную нагрузку перехватчиком. Обратите внимание, что также важно настроить заголовок Content-Length всего запроса.

public class MultipartHeaderInterceptor implements Interceptor {


    @Override public Response intercept(Interceptor.Chain chain) throws IOException {
        Request originalRequest = chain.request();
        String requestBody = requestBodyToString(originalRequest.body());
        String modified = stripHeadersFromMultipart(requestBody);
        Request targetRequest = originalRequest.newBuilder()
                .post(RequestBody.create(MediaType.get("text/plain"), modified))
                .header("Content-Length", String.valueOf(modified.length()))
                .build();
        return chain.proceed(targetRequest);
    }

    private String stripHeadersFromMultipart(String requestBody) {
        String regexToStrip = "; charset=utf-8\r\nContent-Length: \\d*";
        return requestBody.replaceAll(regexToStrip, "");
    }


    private String requestBodyToString(RequestBody body) {
        String bodyAsString = "";
        try (Buffer buffer = new Buffer()) {
            if (body != null) {
                body.writeTo(buffer);
                bodyAsString = buffer.readUtf8();
            }
        } catch (IOException e) {
            log.info(e);
        }
        return bodyAsString;
    }
}

Хотя было бы неплохо иметь менее хакерское решение.

...