繁体   English   中英

Restlet http处理程序失败:媒体类型参数名称中不允许使用“ /”字符

[英]Restlet http handler failed: The “/” Character isn't allowed in a media type parameter name

我正在使用第三方代码将post(form)请求发送到我的apache服务器。 但是,我一直收到以下错误消息:

java.lang.IllegalArgumentException: The Content Type could not be read.
at org.restlet.engine.header.ContentType.<init>(ContentType.java:155)
at org.restlet.engine.adapter.ServerCall.getRequestEntity(ServerCall.java:243)
at org.restlet.engine.adapter.HttpRequest.getEntity(HttpRequest.java:503)
at org.restlet.engine.application.Decoder.beforeHandle(Decoder.java:124)
at org.restlet.routing.Filter.handle(Filter.java:204)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:155)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:84)
at org.restlet.Application.handle(Application.java:384)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.routing.Router.doHandle(Router.java:431)
at org.restlet.routing.Router.handle(Router.java:648)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.routing.Router.doHandle(Router.java:431)
at org.restlet.routing.Router.handle(Router.java:648)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:155)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.routing.Filter.doHandle(Filter.java:159)
at org.restlet.routing.Filter.handle(Filter.java:206)
at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
at org.restlet.Component.handle(Component.java:406)
at org.restlet.Server.handle(Server.java:516)
at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:72)
at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:73)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:80)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:677)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:649)
at sun.net.httpserver.ServerImpl$DefaultExecutor.execute(ServerImpl.java:158)
at sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:433)
at sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:398)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: The "/" character isn't allowed in a media type parameter     name.
at org.restlet.engine.header.ContentTypeReader.readValue(ContentTypeReader.java:178)
at org.restlet.engine.header.ContentType.<init>(ContentType.java:148)
... 41 more
Error while handling an HTTP server call: 
Error while handling an HTTP server call

我在Google上搜索了一下,发现它是来自restlet标头内容处理程序的错误消息。 任何想法如何解决这个问题? 我已经尝试过为帖子添加注释,例如:

@Post("application/json")

或添加请求标头,例如:

        ClientResource cr = new ClientResource("...");
        Series<Header> headers = (Series<Header>) cr.getRequestAttributes().get(
                                         "org.restlet.http.headers");
        if (headers == null) {              
            headers = new Series(Header.class); 
            headers.add("Access-Control-Allow-Origin", "*");
            headers.add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
            headers.add("Access-Control-Allow-Headers", "Content-Type");                
            headers.add("Access-Control-Allow-Headers", "authCode");
            headers.add("Access-Control-Allow-Headers", "origin, x-requested-with, content-type");
        } 

        if (headers != null) {              
            headers.add("Content-Type", "application/json");                
            cr.getRequestAttributes().put("org.restlet.http.headers", headers); 
        }

我希望有人能给出解决这个问题的答案或给我一些建议。

基本上,使用Restlet批注时,请不要使用完整的媒体类型:@Post(“ json”)可以完成此工作。

然后,我不明白为什么要在客户端代码中包含“ Access-Control-Allow-Origin”等内容,也就是说。 此类代码不受跨域限制。

然后,如果您打算将实体发送到服务器,则内容类型实际上由发送的表示形式“托管”。 使用Representation#setMediaType方法。

为了更清楚,您可以查看此页面( http://restlet.com/learn/guide/2.2/core/http-headers-mapping ),其中列出了与Restlet API映射的标头。 不得手动设置任何已映射的标头。

在我看来,您的客户代码必须非常简单:

ClientResource cr = new ClientResource("...");
Representation entity = ...;
entity.setMediaType(MediaType.APPLICATION_JSON);
cr.setEntity(entity);

随意询问更多细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM