#java #spring #rest #curl
Вопрос:
Я пытаюсь создать конечную точку rest с помощью java spring, которая принимает csv-файл.
Мой контроллер выглядит так:
Интерфейс:
package my.company.my.project.trms.controller; import my.company.my.project.trms.controller.common.ControllerUrls.INBOX.CSV; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping(CSV.BASE) public interface CsvController { @PostMapping(produces = "text/csv", consumes = "text/csv") public ResponseEntity create(@RequestBody MultipartFile file); }
*CSV.BASE-это статическая конечная строка, содержащая URL моей конечной точки
Реализация:
package my.company.my.project.trms.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @Slf4j @RequiredArgsConstructor @RestController public class CsvControllerImpl implements CsvController { @Override public ResponseEntity create(MultipartFile file) { String message = ""; return ResponseEntity.status(HttpStatus.OK).body(message); } }
Я хочу протестировать эту конечную точку с помощью следующего скрипта sh на ПК с Windows, используя git bash:
#!/bin/bash curl -X POST "http://localhost:8791/api/public/v1/inboxes/csv" -H "accept: */*" -H "Content-Type: text/csv" --data-binary @/c/Users/Schilling/Desktop/Test.csv
Когда я выполняю сценарий, вызывается мой метод контроллера. Однако установка точки останова показывает мне, что параметр «файл» всегда равен нулю.
Я подозреваю, что что-то не так с синтаксисом пути к файлу в сценарии curl, поэтому я попробовал несколько вещей, включая абсолютные и относительные пути. Причина ошибки также может быть связана с моим классом контроллера.
Редактировать:
Добавление параметра-vv в вызов curl привело к такому результату:
Note: Unnecessary use of -X or --request, POST is already inferred. * Uses proxy env variable no_proxy == '192.168.99.100' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 127.0.0.1:8791... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8791 (#0) gt; POST /api/public/v1/inboxes/csv HTTP/1.1 gt; Host: localhost:8791 gt; User-Agent: curl/7.65.3 gt; accept: */* gt; Content-Type: text/csv gt; Content-Length: 2036 gt; Expect: 100-continue gt; * Mark bundle as not supporting multiuse lt; HTTP/1.1 100 } [2036 bytes data] * We are completely uploaded and fine 100 2036 0 0 100 2036 0 221 0:00:09 0:00:09 --:--:-- 0* Mark bundle as not supporting multiuse lt; HTTP/1.1 200 lt; X-Content-Type-Options: nosniff lt; X-XSS-Protection: 1; mode=block lt; Cache-Control: no-cache, no-store, max-age=0, must-revalidate lt; Pragma: no-cache lt; Expires: 0 lt; X-Frame-Options: SAMEORIGIN lt; Content-Type: text/csv;charset=UTF-8 lt; Content-Length: 0 lt; Date: Fri, 15 Oct 2021 12:37:43 GMT lt; 100 2036 0 0 100 2036 0 203 0:00:10 0:00:09 0:00:01 0 * Connection #0 to host localhost left intact
Комментарии:
1. что показывает-VV?
2. @codebrane спасибо за подсказку, я не знал о существовании этой опции curl. Просьба ознакомиться с отредактированным сообщением выше.
3. curl отправляет тип содержимого: текст/csv поддерживает ли ваша конечная точка этот тип содержимого?
4. @codebrane Это должно быть, по крайней мере, я добавил consumes = «текст/csv» в аннотацию сопоставления.
Ответ №1:
Я думаю, что это должно работать так, как должно быть: Тип содержимого: составные/данные формы в соответствии с кодом.
#!/bin/bash curl -vv -F upload=@/c/Users/Schilling/Desktop/Test.csv "http://localhost:8791/api/public/v1/inboxes/csv"
Комментарии:
1. Этот возвращает код ответа 415. Я добавил к нему-H «Тип содержимого: текст/csv», после чего результат был таким же, как и раньше: файл = null
2. Я также попробовал-H «Тип содержимого: составные/данные формы»
3. ах, я забыл изменить имя параметра.
curl -vv -F file=@/c/Users/Schilling/Desktop/Test.csv "http://localhost:8791/api/public/v1/inboxes/primedex-csv" -H "Content-Type: multipart/form-data"
работал после изменения потребления на «составные/данные формы» в контроллере.