Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Не могу отправить csv файл в jmeter 4.0 в POST запросе

jmeter
post
load
http
Теги: #<Tag:0x00007fedb94152e0> #<Tag:0x00007fedb9415178> #<Tag:0x00007fedb9415038> #<Tag:0x00007fedb9414ef8>

(Олексій Кавунець) #1

Коллеги, всем привет!!! Вот уже пару дней мучаюсь с траблой, не получается отправить csv файл в POST реквесте. Перерыл пол интернета, перепробовал кучу всего, но не работает.

Последний мой вариант выглядит так http://prntscr.com/kar274

Сам запрос:

POST http://uapi.gravitec.net:7830/api/mobile-numbers/load/viber?app_id=1606880952041078784

POST data:

--4e8KzpE-y3gLDkItBb2CN7ttLjUbNJFH
Content-Disposition: form-data; name="csv"; filename="mobs.csv"
Content-Type: text/csv
Content-Transfer-Encoding: binary

<actual file content, not shown here>
--4e8KzpE-y3gLDkItBb2CN7ttLjUbNJFH--


[no cookies]

Request Headers:
Connection: keep-alive
content-type: application/json
accept: application/json, text/plain, */*
Content-Length: 1588
Host: uapi.gravitec.net:7830
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_171)

Сервер присылает:

{
  "httpStatus" : "PAYLOAD_TOO_LARGE",
  "error" : "Preconditions failed!",
  "errorDescription" : "Current request is not a multipart request"
}

Хотя, как видно на скрине, галка мультипарта стоит
В постмене все работает отлично
Фронта еще нет чтоб слизать запрос
Кто сталкивался с подобной проблемой или делал подобное? Помогите советом или добрым словом поддержки)) Второй день уже как женюсь с этим запросом


(Vasiliy Rakshin) #2

Попробуйте добавить в HTTP Header Manager поле с именем
Content-Type и значением multipart/related; boundary=jmeter_is_great
а галку мультипарт отключите.


(Олексій Кавунець) #3

Спасибо за ответ!!
Прислал сервер такое
{
“httpStatus” : “PAYLOAD_TOO_LARGE”,
“error” : “Preconditions failed!”,
“errorDescription” : “Failed to parse multipart servlet request; nested exception is javax.servlet.ServletException: Content-Type != multipart/form-data”
}

Говорит не мульти парт((


(Dmitry Astanin) #4

что то мне сдается, что ваш файл немного больше чем нужно)


(Олексій Кавунець) #5

Та нет. он пару кб весит
Через постман грузится на ура


(Dmitry Astanin) #6

А гляньте как постман формирует запрос мб чем поможет https://i.imgur.com/TDIXkH2.png


(Vasiliy Rakshin) #7

тогда измените на это, и попробуйте без галки


(Олексій Кавунець) #8

Интересно что постмен такое же отправляет http://prntscr.com/karmwn
Может джметр сереализирует его как то коряво


(Dmitry Astanin) #9

Ну не совсем такое. Как выше написали, поиграйтесь с хедерами.


(Олексій Кавунець) #10

При добавлении хедера пустой запрос уже уходит POST http://uapi.gravitec.net:7830/api/mobile-numbers/load/viber?app_id=1606880952041078784

POST data:

[no cookies]


(Олексій Кавунець) #11

Последние достижения:

Добавил хелед менеджер:
Content-Type multipart/form-data; boundary=--------------

В форие аплоуда файла
Mime type application/vnd.ms-excel

Запрос:
POST http://uapi.gravitec.net:7830/api/mobile-numbers/load/viber?app_id=1606880952041078784

POST data:
–JiUIWqIIIknsPxc6E6mhzTKja_cwSbLwcwVmPk_3
Content-Disposition: form-data; name=“csv”; filename=“mobs.csv”
Content-Type: application/vnd.ms-excel
Content-Transfer-Encoding: binary

<actual file content, not shown here>
–JiUIWqIIIknsPxc6E6mhzTKja_cwSbLwcwVmPk_3–

[no cookies]

Request Headers:
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------
accept: application/json, text/plain, /
Content-Length: 1620
Host: uapi.gravitec.net:7830
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_171)

Ответ:
{
“timestamp” : 1532513860340,
“status” : 500,
“error” : “Internal Server Error”,
“message” : “java.io.IOException: Missing initial multi part boundary”,
“path” : “/api/mobile-numbers/load/viber”
}

Даже не знаю шаг ли это вперед


(Олексій Кавунець) #12

Когда баундери добавляю в форме аплоуда файла
То запрос уже такой уходит

POST http://uapi.gravitec.net:7830/api/mobile-numbers/load/viber?app_id=1606880952041078784

POST data:

[no cookies]


(Vasiliy Rakshin) #13

Но тут же почему-то не тот контент-тайп отправляется… Надо вообще как-то из POST data это поле выпилить


(Олексій Кавунець) #14

Я тут взял такой же как постман отправляет


(Олексій Кавунець) #15

С таким майм тайпом http://prntscr.com/katlur такой ответ http://prntscr.com/katmau
java.lang.IllegalArgumentException: MIME type may not contain reserved characters


(Ruslan Semerenko) #16

В первом сообщении стоит заголовок
content-type: application/json
Видимо где-то заменяется оригинальный multipart/form-data


(Олексій Кавунець) #17

Отправил запрос с постмана и записал джметр рекордером. При отправке с джметра та же ошибка:
{
“httpStatus” : “PAYLOAD_TOO_LARGE”,
“error” : “Preconditions failed!”,
“errorDescription” : “Current request is not a multipart request”
}

Выход нашел. Написал запрос на джаве и скормил джметру. Все ок, работает)
Завтра выложу сюда код и инструкцию как что)
Всем спасибо за советы и поддержку))


(Олексій Кавунець) #18

Как и обещал выкладываю свое решение

Необходтмые в зависимости ApacheJMeter_core:

org.apache.jmeter
ApacheJMeter_core
4.0

И ApacheJMeter_java

org.apache.jmeter
ApacheJMeter_java
4.0

Сам класс

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

import java.io.File;
import java.io.Serializable;

public class CsvUploadSampler extends AbstractJavaSamplerClient implements Serializable {

public SampleResult runTest(JavaSamplerContext context) {

    //Вытягиваем необхожимые переменные джметра
    String protocol = context.getJMeterVariables().get("protocol") + "://";
    String apiUrl = context.getJMeterVariables().get("uapi-url");
    String path = context.getJMeterVariables().get("load-mobs-path");
    String portVar = context.getJMeterVariables().get("port");
    String port = portVar != null ? ":" + portParam : "";
    String appId = context.getJMeterVariables().get("app-id");

    SampleResult result = new SampleResult();
    result.sampleStart();

    try {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        HttpEntity entity = MultipartEntityBuilder.create()
                .addBinaryBody("csv", new File("mobs.csv"), ContentType.create("text/csv"), "mobs.csv")
                .build();
        HttpPost httpPost = new HttpPost(protocol + apiUrl + port + path + "?app_id=" + appId);
        httpPost.setEntity(entity);
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity responseEntity = response.getEntity();

        result.sampleEnd();
        result.setSuccessful( true );

        result.setResponseMessage( "Successfully performed action" );
        result.setResponseCodeOK(); // сетаем 200 

        //сетаем в резалт ответ сервера
        result.setResponseData(EntityUtils.toString(responseEntity, "UTF-8"), "UTF-8");
    } catch (Exception e) {
        result.sampleEnd(); 
        result.setSuccessful( false );
        result.setResponseMessage( "Exception: " + e );

        // достаем стектрейс
        java.io.StringWriter stringWriter = new java.io.StringWriter();
        e.printStackTrace( new java.io.PrintWriter( stringWriter ) );
        result.setResponseData( stringWriter.toString(), "UTF-8" );
        result.setDataType( org.apache.jmeter.samplers.SampleResult.TEXT );

        //сетаем код ответа, сюда можно вытащить при желании реальный код ответа сервера
        result.setResponseCode( "500" );         }
    return result;
}

}

Теперь это запаковываем в джарник (можно в джарник без зависимостей) и копируем (джарник) в папку джметра lib/ext. Перезапускаем джметр, добавляем сэмплеэр Java request image,

в поле класснэйм в выпадашке ищем наш класс

Запуcкаем)