• 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...