当前位置: 首页 > 知识库问答 >
问题:

如何预先设置内容类型?正在获取org.jvnet.mimepull.mimeparsingException:缺少起始边界

龙弘济
2023-03-14

我有一个命令行java实用程序,它需要对jersey rest服务进行rest调用

@POST    
@Path("/{name}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response insert(@PathParam("name") String nestName,
                           @QueryParam("id") String id,
                           @FormDataParam("file") InputStream fileStream,
                           @FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException {}
Map<String,String> headers = new HashMap<String,String>();
headers.put(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA + "; boundary=--------------------------458269817398405552698839");
headers.put(HttpHeaders.ACCEPT, "*/*");
headers.put(HttpHeaders.CACHE_CONTROL, "no-cache");
headers.put(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate");

URLConnection conn = url.openConnection();
if(headers!=null && !headers.isEmpty()) {
    for(Map.Entry<String, String> entry: headers.entrySet()) {
        conn.setRequestProperty(entry.getKey(),entry.getValue());
    }
}

ServiceHttpResponse response = new ServiceHttpResponse(con.getResponseCode(), con.getResponseMessage());

javax.ws.rs.BadRequestException:HTTP 400错误请求

在org.glassfish.jersey.media.multipart.internal.multipartreaderclientside.java.188)在org.glassfish.jersey.media.multipart.internal.multipartreaderclientside.readfrom(multipartreaderclientside.java.93)在org.glassfish.jersey.message.internal.readerinterceptorrexecutor$terminalreaderinterceptor.invokereadfrom(.jersey.message.internal.InboundMessageContext.ReadEntity(InboundMessageContext.java:874)位于org.glassfish.jersey.message.internal.InboundMessageContext.java:808)位于org.glassfish.jerse.server.containerRequest.ReadEntity(InboundMessageContext.java:234)位于org.glassfish.jerse.media.multipart.internal.formDataParamValueFactoryProvider

在org.glassfish.jersey.server.model.internal.javaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.GetParamValues(javaResourceMethodDispatcherProvider.java:127)在org.glassfish.jersey.server.model.internal.javaResourceMethodDispatcherProvider$ResponseoutInvoker.doDispatch(javaResourceMethodDispatcherProvider.java:160)

在org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.Dispatch(AbstractJavaResourceMethodDispatcher.java:99)

在org.glassfish.jersey.server.model.ResourceMethodInvoker.Invoke(resourceMethodInvoker.java:389)

在org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(resourceMethodInvoker.java:347)

在org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)

在org.glassfish.jersey.server.serverruntime$2.run(serverruntime.java:326)

在org.glassfish.jersey.internal.errors$1.call(Errors.java:271)

在org.glassfish.jersey.internal.errors$1.call(errors.java:267)

在org.glassfish.jersey.internal.errors.process(errors.java:315)

在org.glassfish.jersey.internal.errors.process(errors.java:297)在org.glassfish.jersey.internal.errors.process(errors.java:267)

在org.glassfish.jersey.process.internal.requestscope.runinscope(requestscope.java:317)在org.glassfish.jersey.server.serverruntime.process(serverruntime.java:305)

在org.glassfish.jersey.server.applicationhandler.handle(applicationhandler.java:1154)

在org.glassfish.jersey.servlet.webcomponent.serviceImpl(webcomponent.java:473)在org.glassfish.jersey.servlet.webcomponent.service(webcomponent.java:427)

在org.glassfish.jersey.servlet.servletContainer.service(servletContainer.java:388)

在org.glassfish.jersey.servlet.servletContainer.service(servletContainer.java:341)

在org.glassfish.jersey.servlet.servletContainer.service(servletContainer.java:228)

在org.eclipse.jetty.servlet.servletholder.handle(servletholder.java:808)

在org.eclipse.jetty.servlet.servlethandler$cachedchain.doFilter(servlethandler.java:1669)

在com.cadence.adw.common.generic.xml.server.service.http.RequestInterceptor.doFilter(RequestInterceptor.java:95)

在org.eclipse.jetty.servlet.servlethandler$cachedchain.doFilter(servlethandler.java:1652)

在org.eclipse.jetty.servlets.useragentfilter.doFilter(useragentfilter.java:83)在org.eclipse.jetty.servlets.gzipfilter.doFilter(gzipfilter.java:300)

在org.eclipse.jetty.servlet.servlethandler$cachedchain.doFilter(servlethandler.java:1652)在org.eclipse.jetty.servlet.servlethandler.doHandle(servlethandler.java:585)

在org.eclipse.jetty.server.session.sessionHandler.doHandle(SessionHandler.java:221)

在org.eclipse.jetty.server.handler.contextHandler.doHandle(contextHandler.java:1127)

在org.eclipse.jetty.servlet.servlethandler.doscope(servlethandler.java:515)

在org.eclipse.jetty.server.session.sessionHandler.doscope(sessionHandler.java:185)在org.eclipse.jetty.server.handler.contextHandler.doscope(contextHandler.java:1061)

在org.eclipse.jetty.server.handler.scopedhandler.handle(scopedhandler.java:141)

在org.eclipse.jetty.server.handler.ContextHandlerCollection.Handle(ContextHandlerCollection.java:215)

在org.eclipse.jetty.server.handler.handlercollection.handle(handlercollection.java:110)

在org.eclipse.jetty.server.handler.handlerwrapper.handle(handlerwrapper.java:97)

在org.eclipse.jetty.server.server.handle处(server.java:497)

在org.eclipse.jetty.server.httpchannel.handle(httpchannel.java:310)在org.eclipse.jetty.server.httpconnection.onfillable(httpconnection.java:257)

在org.eclipse.jetty.io.abstractConnection$2.run(abstractConnection.java:540)

在org.eclipse.jetty.util.thread.queuedthreadpool.runjob(queuedthreadpool.java:635)

在org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)

在java.lang.Thread.Run(thread.java:748)

原因:org.jvnet.mimepull.mimeparsingException:缺少起始边界

在org.jvnet.mimepull.mimeparser.skippreamble(mimeparser.java:318)

在org.jvnet.mimepull.mimeparser$mimeeventiterator.next(mimeparser.java:154)

在org.jvnet.mimepull.mimeparser$mimeeventiterator.next(mimeparser.java:132)

在org.jvnet.mimePull.mimeMessage.MakeProgress(mimeMessage.java:228)在org.jvnet.mimePull.mimeMessage.ParseAll(mimeMessage.java:189)

在org.jvnet.mimepull.mimeMessage.getAttachments(mimeMessage.java:115)

在org.glassfish.jersey.media.multipart.internal.multipartReaderClientSide.getMimeParts(MultipartReaderClientSide.java:272)

在org.glassfish.jersey.media.multipart.internal.multipartreaderclientside.readmultipart(Multipartreaderclientside.java:231)

在org.glassfish.jersey.media.multipart.internal.multipartreaderserverside.readmultipart(Multipartreaderserverside.java:91)

在org.glassfish.jersey.media.multipart.internal.multipartreaderclientside.readfrom(multipartreaderclientside.java:183)

...还有58个

共有1个答案

杨宏儒
2023-03-14

设置请求参数不是发送多部分请求的正确方法。仅仅设置带有边界的content-type是不够的。该边界用于在请求主体内部分隔请求的不同“部分”,也用于结束主体。例如:

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

URLConnection(或HTTPURLConnection)没有任何API来轻松发送多部分请求。您需要手动创建这个请求体,并通过连接的输出流发送出去。

multipart的目的是发送多个参数,其中一些参数是二进制对象,如图像文件等。如果所有参数都只是文本,那么可以使用application/x-www-form-urlencodedcontent-type。这就是当您发出POST请求时,在HTTPURLConnection上设置请求参数所做的事情。然后在服务器上使用@formparam(“param-name”)而不是@formdataparam。如果您正在发出GET请求,则为@queryparam

如果您想要发出多部分请求,那么您应该查看支持发送多部分请求的客户机,而不是必须手动构造正确的正文格式。您可以查看泽西客户端及其多部分支持。还有许多其他客户端库。只是做些搜索。

  • @FormDataParam和@FormParam之间有什么区别?
 类似资料:
  • 我在客户端使用的组件是这样的:ngx上传器 在我的请求选项中,我设置了它们,您可以在这里看到: 而服务器端我的控制器操作签名是: 此控制器操作中的断点永远不会被命中。 有人能分享一下这里发生的事情吗? 在这里,根据请求,我将发布我的请求头和负载: 提前谢谢。

  • 问题内容: 我正在使用Flask,并且从get请求返回一个XML文件。如何将内容类型设置为xml? 例如 问题答案: 尝试这样: 实际的Content-Type基于mimetype参数和字符集(默认为UTF-8)。

  • 我正在使用Flask,并从get请求返回一个XML文件。如何将内容类型设置为xml? 例如。

  • null 当我创建正文部分时,我是否应该显式地设置top mime消息的内容类型,然后设置每个正文部分? 如果是,在上面的例子中它们应该是什么? 对于html建议,对于附件建议,对于内联建议。我正在使用所有这些,那么对于完整的消息和不同的主体部分应该是什么内容类型? 通过上面的代码,我得到了正确的html文本,纯文本,内联图像和附件在正确的地方与James集成的ThunderBird。 因此,我不

  • 问题内容: 以前,我问过如何获取Flask请求中的数据,因为它是空的。答案解释为原始帖子正文,但如果分析表单数据将为空。我如何无条件获得原始职位? 问题答案: 使用获得的原始数据,而不管内容类型。该数据被缓存,你可以随后访问随意。 如果你首先访问,它将首先调用一个参数以解析表单数据。如果请求具有形式的内容类型(,或),则原始数据将被消耗。并且在这种情况下将显示为空。

  • 我的大摇大摆的ui显示“参数内容类型”,其中包含各种条目:、、和。 我只想要。 在repo上有一个类似的未解决的问题,它使用了这个可视化(旧的ui,但相同的想法): 版本 版本