Groovy 多部分标题似乎被忽略
我有下面的代码,它应该发送一个POST请求到一些服务,基本上发布一个文件 此请求是Groovy 多部分标题似乎被忽略,groovy,header,multipartform-data,Groovy,Header,Multipartform Data,我有下面的代码,它应该发送一个POST请求到一些服务,基本上发布一个文件 此请求是多部分/表单数据。它包括: JSON Base64文件 代码如下: sendMultipartPost(); def sendMultipartPost() { def URLToGo = 'http://127.0.0.1:8080/sd/services/rest/find/'; def httpRequest = new HTTPBuilder(URLToGo); def authToke
多部分/表单数据
。它包括:
- JSON
- Base64文件
sendMultipartPost();
def sendMultipartPost()
{
def URLToGo = 'http://127.0.0.1:8080/sd/services/rest/find/';
def httpRequest = new HTTPBuilder(URLToGo);
def authToken = 'AR-JWT ' + 'TOKEN';
def headers = ['Authorization' : authToken, 'Content-Type' : 'multipart/form-data; boundary=W3NByNRZZYy4ALu6xeZzvWXU3NVmYUxoRB'];
httpRequest.setHeaders(headers);
def body = ["values":["Incident Number":'testSC',"Work Log Type":"General Information","Description":"File has been added TESTFile","z2AF Work Log01":'Test File title']];
httpRequest.request(Method.POST)
{
req ->
MultipartEntity multiPartContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, 'W3NByNRZZYy4ALu6xeZzvWXU3NVmYUxoRB', Charset.forName("UTF-8"));
Gson gson = new Gson();
String jsonObj = gson.toJson(body);
multiPartContent.addPart('entry', new StringBody(jsonObj, ContentType.APPLICATION_JSON));
multiPartContent.addPart('attach-z2AF Work Log01', new ByteArrayBody(Base64.encodeBase64("let's createBase64 let's createBase64 let's createBase64 let's createBase64 let's createBase64".getBytes()), ContentType.APPLICATION_OCTET_STREAM, 'test file title'));
req.setEntity(multiPartContent);
response.success = { resp ->
if (resp.statusLine.statusCode == 200) {
// response handling
}
}
response.failure = { resp, json ->
result = groovy.json.JsonOutput.toJson(['state':resp.status])
}
}
}
但是,每当我发送请求时,似乎都会丢失或未指定某些标头:
但“完美”请求如下所示:
现在我们可以得出以下JSON头的结论:
- 缺少JSON的
(尽管您可以看到第一部分,即JSON,属于内容类型
)ContentType.APPLICATION\u JSON
不是自动指定的字符集
不是自动指定的内容传输编码
不是自动指定的内容传输编码
- 为什么JSON的头
内容类型
在我实际设置时不存在
- 如何指定根本不存在的标题
HttpMultipartMode.BROWSER\u兼容的模式。删除它,您将获得内容类型
标题
如何指定根本不存在的标题
此库中的唯一方法是使用FormBodyPart
包装任何正文并添加所需的标题
下面是一个可以在groovyconsole中运行的代码示例
@Grab(group='org.apache.httpcomponents',module='httpime',version='4.5.10')
导入org.apache.http.entity.mime.MultipartEntityBuilder
导入org.apache.http.entity.ContentType
导入org.apache.http.entity.mime.content.StringBody
//导入org.apache.http.entity.mime.content.ByteArrayBody
导入org.apache.http.entity.mime.FormBodyPartBuilder
//表单部件能够指定其他部件标题
def表格(地图m){
def p=FormBodyPartBuilder.create(m.remove('name')、m.remove('body'))
m、 每个{k,v->p.addField(k,v.toString())}//所有其他键都假定为头
返回p.build()
}
def json='{“aaa”:111,“bbb”:222,“ccc”:333}'
def multipart=MultipartEntityBuilder.create()
.addTextBody(“foo”,“bar”)//使用默认编码传输文本
.addTextBody(“theJson”,json,ContentType.APPLICATION_json)//具有内容类型的文本
.addPart(表格(
//添加带有标题的部件
名称:'TheJsonWithHdrs',
正文:新的StringBody(json.getBytes(“UTF-8”).encodeBase64().toString(),ContentType.APPLICATION_json),
“内容传输编码”:“base64”,
))
.build()
//打印结果
def b=新的ByteArrayOutputStream()
多部分写入(b)
println b.toString(“ASCII”)
结果
--s89LGRZ8HCJ4Gimdis8AH2pXpUQyEpvalzB
Content-Disposition: form-data; name="foo"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
bar
--s89LGRZ8HCJ4Gimdis8AH2pXpUQyEpvalzB
Content-Disposition: form-data; name="theJson"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{"aaa":111,"bbb":222,"ccc":333}
--s89LGRZ8HCJ4Gimdis8AH2pXpUQyEpvalzB
Content-transfer-encoding: base64
Content-Disposition: form-data; name="TheJsonWithHdrs"
Content-Type: application/json; charset=UTF-8
eyJhYWEiOjExMSwiYmJiIjoyMjIsImNjYyI6MzMzfQ==
--s89LGRZ8HCJ4Gimdis8AH2pXpUQyEpvalzB--
有人请编辑它以显示图片这里没有StringBody的内容类型的构造函数。不,这里有StringBody(String text,org.apache.http.entity.ContentType ContentType)
显示指向文档的链接。就是您发送的链接。您好,非常感谢,但很遗憾,我们无法使用该库。我已将HttpMultipartMode
更改为HttpMultipartMode.STRICT
,现在JSON(第一个多部分)的头出现了!但是,内容传输编码
头的值错误。它是二进制的,但应该是base64或不存在。。。请先看一看,谢谢。这是同一个图书馆。。我相信你可以用它。但是,不要使用arraybody发送base64字符串。使用stringbody和formbody部件可以指定自定义标题OK,问题是我们没有org.apache.ivy.ivy
来使用@Grab
。还有其他方法吗?@Grab-它只是作为一个简单的脚本来执行。评论它。非常感谢,内容传输编码的base64值是多余的。只需切换到HttpMultipartMode.STRICT
就成功了!