• 0
danilo.magrini

Upload de anexo na API de mensagens

Question

Alguém conseguiu fazer o upload de anexo na API de mensagens em Java? Na documentação somente mostra como faz usando 'curl'  não consigo subir via API Rest. Sempre recebo a mensagem:

{"message":"File attachment must not be empty","error":"bad_request","status":400,"cause":[]}

 

Usando o Postman consegui tranquilamente conforme a imagem.

Captura de tela de 2017-08-16 18-44-10.png

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Consegui, segue explicação para quem precisar. 

Como meu ERP é desenvolvido em Delphi, não vou postar código, apenas uma explicação. 

Deve passar como parâmetros de formulário (Key=Value,File=Referência para o Arquivo) e além disso o próprio arquivo com o content-type = application/pdf e o Content-Encoding = multipart/form-data.

Segue parte do código para quem utiliza Delphi: 

    LMultiDt := TIdMultiPartFormDataStream.Create;
    LMultiDt.AddFormField('key','value');
    LMultiDt.AddFormField('file','caminho_do_arquivo_no_caso_pdf');
    LMultiDt.AddFile('file',caminho_do_arquivo_no_caso_pdf,'application/pdf');

    idhttpConn.Post(https://api.mercadolibre.com/messages/attachments?access_token=$ACCESS_TOKEN,LMultiDt,Stream);

    Stream.DataString = referência do anexo criado

 

Share this post


Link to post
Share on other sites
  • 0
On 2/23/2018 at 8:52 AM, Marcos Fincotto said:

Segue parte do código para quem utiliza Delphi: 


    LMultiDt := TIdMultiPartFormDataStream.Create;
    LMultiDt.AddFormField('key','value');
    LMultiDt.AddFormField('file','caminho_do_arquivo_no_caso_pdf');
    LMultiDt.AddFile('file',caminho_do_arquivo_no_caso_pdf,'application/pdf');

    idhttpConn.Post(https://api.mercadolibre.com/messages/attachments?access_token=$ACCESS_TOKEN,LMultiDt,Stream);

    Stream.DataString = referência do anexo criado

Vlw parceiro, estava tendo os mesmos problemas que você e consegui arrumar uma solução apartir das explicação...

 

Vou deixar aqui a resolução para Java: 

 

Quote

public class MultipartUtility {

    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;

    /**
     * This constructor initializes a new HTTP POST request with content type is set
     * to multipart/form-data
     *
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(String requestURL, String charset) throws IOException {
        this.charset = charset;

        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true);
    }

    /**
     * Adds a form field to the request
     *
     * @param name  field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"").append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Adds a upload file section to the request
     *
     * @param fieldName  name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile) throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();
        writer.append(LINE_FEED);
        writer.flush();
    }

    /**
     * Adds a header field to the request.
     *
     * @param name  - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Completes the request and receives response from the server.
     *
     * @return a list of Strings as response in case the server returned status OK,
     *         otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();
        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();

        // checks server's status code first
        int status = httpConn.getResponseCode();
            BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        return response;
    }
}

Quote

File file = new File("caminho_do_arquivo_no_computador");
            MultipartUtility multipart = new MultipartUtility("https://api.mercadolibre.com/v1/claims/ID_RECLAMAÇÃO/attachments?access_token=$ACCESS_TOKEN", "UTF-8");
            multipart.addFormField("key", "value");
            multipart.addFormField("file", "caminho_do_arquivo_no_computador");
            multipart.addFilePart("file", file);
            List<String> response = multipart.finish();
            response.forEach(System.out::println);

A diferença é que fiz postando no recurso Claims, mas a forma de postagem é a mesma para o Mensagens Pós Venda.

Edited by Natan Avila

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now