我有一个命令行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个
设置请求参数不是发送多部分请求的正确方法。仅仅设置带有边界的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-urlencoded
content-type。这就是当您发出POST请求时,在HTTPURLConnection
上设置请求参数所做的事情。然后在服务器上使用@formparam(“param-name”)
而不是@formdataparam
。如果您正在发出GET请求,则为@queryparam
。
如果您想要发出多部分请求,那么您应该查看支持发送多部分请求的客户机,而不是必须手动构造正确的正文格式。您可以查看泽西客户端及其多部分支持。还有许多其他客户端库。只是做些搜索。
我在客户端使用的组件是这样的: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,但相同的想法): 版本 版本