Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 多部分标题似乎被忽略_Groovy_Header_Multipartform Data - Fatal编程技术网

Groovy 多部分标题似乎被忽略

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

我有下面的代码,它应该发送一个POST请求到一些服务,基本上发布一个文件

此请求是
多部分/表单数据
。它包括:

  • 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
  • 字符集
    不是自动指定的
  • 内容传输编码
    不是自动指定的
截至base64:

  • 内容传输编码
    不是自动指定的
因此,我有两个问题:

  • 为什么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
就成功了!