使用HTTPie或Curl通过JHipster REST服务加载文件 [英] Load a file via JHipster REST service using HTTPie or Curl

查看:18
本文介绍了使用HTTPie或Curl通过JHipster REST服务加载文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个JHipster(v5.3.1)应用程序,它有一个实体Attachment,其中包含一个名为fileAttachmentBlob字段。使用生成的角度6网络前端,我能够加载文件到应用程序。我想使用命令行(HTTPiecurl)执行相同的操作。

附件的JDL定义为:

/**
 * An entity to store attachments
 */
entity Attachment {
  /** The name of the attachment */
  fileName String required,
  /** the attachment */
  attachedFile Blob required
}

JHipster生成器构造Attachment.javaAttachmentService.javaAttachmentResource.java,我根本没有修改它们。

使用Web前端在加载文件时记录以下语句:

2018-09-18 09:18:11.501 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.aop.logging.LoggingAspect    : Enter: com.kaleido.kapture.web.rest.AttachmentResource.createAttachment() with argument[s] = [Attachment{id=null, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}]
2018-09-18 09:18:11.502 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.web.rest.AttachmentResource  : REST request to save Attachment : Attachment{id=null, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}
2018-09-18 09:18:11.504 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.aop.logging.LoggingAspect    : Enter: com.kaleido.kapture.service.AttachmentService.save() with argument[s] = [Attachment{id=null, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}]
2018-09-18 09:18:11.518 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.service.AttachmentService    : Request to save Attachment : Attachment{id=null, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}
    Hibernate: call next value for hibernate_sequence
2018-09-18 09:18:11.562 DEBUG 14151 --- [  XNIO-2 task-7] o.j.core.metamodel.type.TypeFactory      : javersType of class com.kaleido.kapture.domain.Attachment inferred as EntityType
2018-09-18 09:18:11.564 DEBUG 14151 --- [  XNIO-2 task-7] o.j.core.metamodel.type.TypeFactory      : javersType of class java.lang.Long inferred as ValueType, it's used as id-property type
2018-09-18 09:18:11.597 DEBUG 14151 --- [  XNIO-2 task-7] o.j.core.metamodel.type.TypeFactory      : javersType of class [B spawned as ArrayType from prototype ArrayType{baseType:'class [Ljava.lang.Object;'}
2018-09-18 09:18:11.599 DEBUG 14151 --- [  XNIO-2 task-7] o.javers.core.graph.ObjectGraphBuilder   : live graph assembled, object nodes: 1, entities: 1, valueObjects: 0
2018-09-18 09:18:11.695  INFO 14151 --- [  XNIO-2 task-7] org.javers.core.Javers                   : Commit(id:1.0, snapshots:1, author:admin, changes - NewObject:1), done in 144 millis (diff:71, persist:73)
2018-09-18 09:18:12.096 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.aop.logging.LoggingAspect    : Exit: com.kaleido.kapture.service.AttachmentService.save() with result = Attachment{id=1001, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}
    Hibernate: insert into attachment (attached_file, attached_file_content_type, file_name, id) values (?, ?, ?, ?)
2018-09-18 09:18:12.104 DEBUG 14151 --- [  XNIO-2 task-7] c.k.kapture.aop.logging.LoggingAspect    : Exit: com.kaleido.kapture.web.rest.AttachmentResource.createAttachment() with result = <201 Created,Attachment{id=1001, fileName='test', attachedFile='[B@396897d6', attachedFileContentType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'},{Location=[/api/attachments/1001], X-kaptureApp-alert=[A new attachment is created with identifier 1001], X-kaptureApp-params=[1001]}>

使用HTTPie我可以进行身份验证并获得JWT令牌

http POST :8080/api/authenticate password=**** username=admin

但是,如何POST文件:

并不明显
http -v --form POST :8080/api/attachments/ 
    'Authorization:Bearer ***.***.***' 
    fileName=test.txt 
    attachedFile@test.txt 
    attachedFileContentType=text/plain

结果:

POST /api/attachments/ HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Authorization: Bearer ****.****.****
Connection: keep-alive
Content-Length: 404
Content-Type: multipart/form-data; 
boundary=087aa239fc6f4eb197fa883424e2bdc3
Host: localhost:8080
User-Agent: HTTPie/0.9.9

--087aa239fc6f4eb197fa883424e2bdc3
Content-Disposition: form-data; name="fileName"

test.txt
--087aa239fc6f4eb197fa883424e2bdc3
Content-Disposition: form-data; name="attachedFileContentType"

text/plain
--087aa239fc6f4eb197fa883424e2bdc3
Content-Disposition: form-data; name="attachedFile"; 
filename="test.txt"
Content-Type: text/plain

test test test

--087aa239fc6f4eb197fa883424e2bdc3--

HTTP/1.1 415 Unsupported Media Type
Accept: application/octet-stream, text/plain, application/xml, text/xml, application/x-www-form-urlencoded, application/x-jackson-smile, application/*+xml, multipart/form-data, application/json, application/cbor, application/*+json, */*
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Type: application/problem+json
Date: Tue, 18 Sep 2018 14:27:08 GMT
Expires: 0
Pragma: no-cache
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block

{
    "detail": "Content type 'multipart/form-data;boundary=087aa239fc6f4eb197fa883424e2bdc3;charset=UTF-8' not supported",
    "message": "error.http.415",
    "path": "/api/attachments/",
    "status": 415,
    "title": "Unsupported Media Type",
    "type": "https://www.jhipster.tech/problem/problem-with-message"
}

我应该如何构造POST

更新

当我在Chrome开发人员视图中查看正在发生的事情时,我看到请求有效负载是

{"fileName":"test.txt","attachedFileContentType":"text/plain","attachedFile":"dGVzdCB0ZXN0IHRlc3QK"}

不清楚attachedFile值来自哪里?

Web用户界面生成的请求头为:

POST /api/attachments HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 100
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
X-XSRF-TOKEN: *****************
Authorization: Bearer ****.****.****.****
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36
Content-Type: application/json
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: 
    access_token=****.****.****; session_token=****; XSRF-TOKEN=*****; Idea-1c443776=2050c190-4f64-4a09-a50c-a0ef97b6a9da; io=p4GYHllrvXuakjfbAAAA

推荐答案

解决方案是对文件进行Base64编码,并将该字符串作为attachedFile的值提供(感谢Jon Ruddlell的提示)。

以下调用将创建一条记录,其附件名为test.txt,Base64编码内容为"test test test",内容类型为text/plain

http POST :8080/api/attachments/ 
  'Authorization:Bearer ****.****.****' 
  fileName=test.txt 
  attachedFile=dGVzdCB0ZXN0IHRlc3QK 
  attachedFileContentType=text/plain

对于任何实际文件,在命令行中包含文件的Base64编码都是不现实的。所以你 是否应将Base64将内容编码为文件,然后使用http引用该文件,从而使其成为JSON的一部分 正文。

对一个文件(schema.png)进行编码,并将编码写入另一个文件(schema.png.base64):

openssl base64 -in schema.png > schema.png.base64

POST文件名schema2.png和媒体类型image/png

http POST :8080/api/attachments/   
  'Authorization:Bearer ****.****.***' 
   fileName=schema2.png 
   attachedFile=@schema.png.base64 
   attachedFileContentType=image/png

这篇关于使用HTTPie或Curl通过JHipster REST服务加载文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆