Спрей-клиент Post Multipart

Я хочу использовать спрей для отправки на сервер составной формы. В частности, я хочу опубликовать изображение.

У меня проблемы с маршаллингом файла в Multipart. Несмотря на то, что в Spray они упоминают, что это Marshaller по умолчанию, я просто не могу соединить их вместе.

В настоящее время я использую Spray 1.0-M7, так как я еще не перешел на Scala 2.10, если бы пример мог быть совместим с этой веткой, это было бы замечательно.

В настоящее время у меня есть это:

val bis = new BufferedInputStream(new FileInputStream(file))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray")
pipeline(Post("/saveImageWithSpray", bArray)) 

И, конечно же, я получаю сообщение об ошибке:

For request 'POST /saveImageWithSpray' [Missing boundary header]

Большинство примеров, которые я нахожу, используют директиву content(as[X]) для marshall, но я не использую Spray-routing, мне просто нужно выполнить сообщение с помощью spray-client в приложении, построенном на другом фреймворке.

Спасибо

ИЗМЕНИТЬ

Мне действительно удалось упорядочить это так:

val pipeline = (
 addHeader("Content-Type", "multipart/form-data")
  ~> sendReceive(conduit)
)
val bis = new BufferedInputStream(new FileInputStream(file, "UTF-8"))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray

Logger.error("About to post with spray "+bArray.length.toString)
pipeline(Post("/saveImageWithSpray", MultipartFormData(Map(
  "spray-file" -> BodyPart(
    HttpEntity(Some(HttpBody(ContentType(MediaTypes.`image/gif`), bArray))),
    HttpHeaders.`Content-Disposition`("form-data", Map("name" -> "spray-file","filename"->"Fuurin (Glass Wind Chime).gif"))::Nil
    )
  ))))

К сожалению, это все еще не работает, данные передаются, но сервер не может найти файл.

Захват wireshark показывает следующее:

POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
User-Agent: spray-can/1.0-M7
Content-Type: multipart/form-data; boundary="oxz40rxXXQyDx+IUKcz7QYpJ"
Content-Length: 1725

--oxz40rxXXQyDx+IUKcz7QYpJ
Content-Disposition: form-data; name="spray-file"
Content-Disposition: form-data; name="spray-file"; filename="Fuurin (Glass Wind Chime).gif"
Content-Type: image/gif

GIF89a0.0..........
BINARY DATA
..P...L0..8.....X.....l..?...;
--oxz40rxXXQyDx+IUKcz7QYpJ--HTTP/1.1 500 Internal Server Error
Content-Type: text/plain; charset=utf-8
Content-Length: 25

File not found spray-file

Это запись действительного запроса, сделанного с помощью Advanced Rest Client:

POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Content-Length: 2573
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuiIgwVg3rBQLFNGB
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

------WebKitFormBoundaryuiIgwVg3rBQLFNGB
Content-Disposition: form-data; name="spray-file"; filename="Gunsen (Fan) .gif"
Content-Type: image/gif

GIF89a0.0.........u.QQ..Z..z.wW[[[.
BINARY DATA
.....&...Z(.c.Q.....T.B7..S...!...p[...8."...;
------WebKitFormBoundaryuiIgwVg3rBQLFNGB--
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 24

File uploaded with spray

person dgrandes    schedule 12.06.2013    source источник
comment
Кажется, существует недостаток текущего маршаллера MultipartFormData, который не поддерживает параметры filename. Я создал задачу, чтобы отслеживать это: github.com/spray/spray/issues/327   -  person jrudolph    schedule 19.06.2013
comment
Итак, @dgrandes ... ваше исправление сработало? Является ли имя файла спрея вашим элементом данных формы? У меня аналогичная проблема с двумя элементами данных формы: файлом text/csv и строкой авторизации. Вы сами создали граничную строку? Спасибо   -  person iyerland    schedule 06.10.2014
comment
Извините, @iyerland, в итоге я отказался от спрея и внедрил его прямо в Play! Рамки. Извини!   -  person dgrandes    schedule 06.12.2014


Ответы (1)


@grandes Спасибо за ответ. Я использовал клиентскую библиотеку newman rest (https://github.com/stackmob/newman) для отправки http запросы, но пришлось создать MultipartFormData вручную, и это сработало. Это будет исправлено в Newman в ближайшем будущем. Вот ссылка, которую я использовал для ручного создания данных составной формы: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

person iyerland    schedule 09.12.2014