CAMEL HTTP4 почтовый запрос был отклонен, так как не было найдено многочастной границы - PullRequest
0 голосов
/ 04 мая 2018

Я использую Camel-http4, потому что мне просто нужен продюсер, а не разоблачающий веб-сервис. Мне просто нужно отправить файлы на HTTP-сервер, так что это реализация клиента. проблема, с которой я сталкиваюсь, - попытка отправить, возвращает ошибку.

CamelHttpResponseCode = 403, CamelHttpResponseText = Запрещено

{"timestamp": "2018-05-03T20: 36: 20.571", "traceId": "", "path": "[POST] https://apm -query-svc-prod.apm- api.com/v2/t_series/upload%2520?throwExceptionOnFailure=false","errors":[["httpStatusCode":"FORBIDDEN","code":"FORBIDDEN","message":" не удалось проанализировать многоэлементный запрос сервлета; вложенное исключение: java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: запрос был отклонен, так как не было найдено многочастной границы "," detail ": null," requestId ": null }]}

Вопрос, есть ли способ сделать это с Camel-HTTP4? как это можно сделать? и спасибо !!!

вот маршрут

<route 
    id="core.pr.upload.route"
    autoStartup="false" >
    <from uri="{{uploadEntranceEndpoint}}" />
    <process ref="customerEntitesProcessor" />
    <process ref="customerTokenProcessor" />
    <process ref="uploadProcessor" />
    <setHeader headerName="CamelHttpUri">
        <simple>${header.UPLOADURL}?throwExceptionOnFailure=false</simple>
    </setHeader>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http4://apm-query-svc-prod.app-api.aws-usw02-pr.io:443/v2/t_series/upload?throwExceptionOnFailure=false" />
    <log message="After POSTING FILE: ${body}" loggingLevel="INFO"/>    
    <to uri="{{afteruploadLocation}}" />
</route>

вот класс, я просто устанавливаю заголовки, и URI переопределяется с тем, который предоставлен Exchange.HTTP_URI.

открытый класс UploadProcessor реализует процессор {

private static final Logger LOG = LoggerFactory.getLogger(UploadProcessor.class);

@Override
public void process(Exchange exchange) throws Exception {

    LOG.info("Entering Upload Processor ..." );

        final String tenant = (String)exchange.getIn().getHeader("TENANT");
        final String token = (String)exchange.getIn().getHeader("TOKEN");
        final String uploadUrl = (String)exchange.getIn().getHeader("UPLOADURL");
        final String custKey = (String)exchange.getIn().getHeader("CUSTKEY");

        LOG.info("TENANT: " + tenant);
        LOG.info("TOKEN: " + token);
        LOG.info("UPLOADURL: " + uploadUrl);
        LOG.info("CUSTKEY: " + custKey);

        LOG.info("Uploading File for CustKey: " + custKey + " and Tenant: " + tenant);          

        StringBuilder authHeader = new StringBuilder("Bearer "); 
        authHeader.append(token);           
        LOG.info("Authorization: " + authHeader.toString());

        exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
        exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
        exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
        exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
        exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
        exchange.getIn().setHeader("x-ge-csvformat", "ODB");
        exchange.getIn().setHeader("Tenant", tenant);
        exchange.getIn().setHeader("Content-Type", "multipart/form-data");  //"Content-Type" ; boundary=
        exchange.getIn().setHeader("Authorization", authHeader.toString());
        LOG.info("Exiting Upload Processor: Finish " );
    }

}

это мое первое введение в HTTP, не знакомое с многочастной границей, я надеюсь, что есть какое-то простое решение для этого. :) спасибо !!!

Решение не было таким уж сложным, вот окончательный вариант, основанный на ответе Ральфа. Спасибо всем! сложная часть заключалась в поиске пакетов импорта и в том, что он имеет зависимость добавить в POM

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.1</version>
</dependency>


import java.lang.StringBuilder;
import java.net.URLEncoder;
import java.util.Base64;
import java.io.File;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.camel.LoggingLevel;
import org.apache.http.HttpEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
public class UploadProcessor implements Processor {

    private static final Logger LOG = LoggerFactory.getLogger(UploadProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {

        LOG.info("Entering Upload Processor ..." );

            final String tenant = (String)exchange.getIn().getHeader("TENANT");
            final String token = (String)exchange.getIn().getHeader("TOKEN");
            final String uploadUrl = (String)exchange.getIn().getHeader("UPLOADURL");
            final String custKey = (String)exchange.getIn().getHeader("CUSTKEY");

            LOG.info("TENANT: " + tenant);
            LOG.info("TOKEN: " + token);
            LOG.info("UPLOADURL: " + uploadUrl);
            LOG.info("CUSTKEY: " + custKey);

            LOG.info("Uploading File for CustKey: " + custKey + " and Tenant: " + tenant);          

            StringBuilder authHeader = new StringBuilder("Bearer "); 
            authHeader.append(token);           
            LOG.info("Authorization: " + authHeader.toString());

            exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
            exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
            exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
            exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
            exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
            exchange.getIn().setHeader("x-ge-csvformat", "ODB");
            exchange.getIn().setHeader("Tenant", tenant);
            exchange.getIn().setHeader("Authorization", authHeader.toString());

            // Process the file in the exchange body
            File file = exchange.getIn().getBody(File.class);
            String fileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
            LOG.info("fileName: " + fileName);

            MultipartEntityBuilder entity = MultipartEntityBuilder.create();
            entity.addBinaryBody("file", file);
            entity.addTextBody("name", fileName);

            exchange.getIn().setBody(entity.build());
            LOG.info("Exiting Upload Processor: Finish " );

        }
}
...