我不确定访问请求的 URL 部分的正确方法是什么。
在这种情况下,我想获取没有查询变量的请求路径。这是我发现的唯一方法:
String path = getRequest().getResourceRef().getHostIdentifier() +
getRequest().getResourceRef().getPath();
Run Code Online (Sandbox Code Playgroud)
结果将是此网址的粗体部分:https : //stackoverflow.com/questions/ask ?query=value
我还发现了大约 6 种不同的方法来获取服务器名称(http://stackoverflow.com),但我担心其中一些方法会在我不知道的某些情况下失败(为什么会有 6 种不同的方法来做)一件事):
getRequest().getHostRef().getHostIdentifier();
getRequest().getHostRef().getIdentifier();
getRequest().getRootRef().getHostIdentifier();
getRequest().getRootRef().getIdentifier();
getRequest().getResourceRef().getHostIdentifier();
Run Code Online (Sandbox Code Playgroud)
这似乎获得了带有查询参数的完整 URL:
getRequest().getResourceRef().getIdentifier();
Run Code Online (Sandbox Code Playgroud)
任何进一步的解释将不胜感激。
我似乎无法弄清楚如何将标头添加到我的restlet响应中.当我看到在可用的方法Response的对象,我看到的是setStatus,setEntity和setAttributes但这些都不告诉我如何设置自定义HTTP头的响应.
例如,我有一个GET调用返回类似如下的内容:
HTTP/1.1 200 OK
Content-Type: text/json
Content-Length: 123
Some-Header: the value
Some-Other-Header: another value
{
id: 111,
value: "some value this could be anything",
diagnosis: {
start: 12552255,
end: 12552261,
key: "ABC123E11",
source: "S1",
}
}
Run Code Online (Sandbox Code Playgroud)
不管它是什么.在handleGet方法中,我这样处理它:
final MediaType textJsonType = new MediaType("text/json");
@Override
public void handleGet() {
log.debug("Handling GET...");
final Response res = this.getResponse();
try {
final MyObject doc = this.getObj("hello", 1, "ABC123E11", "S1");
final String …Run Code Online (Sandbox Code Playgroud) 我在java中使用Tomcat服务器,并希望能够从restlet资源访问ServletContext,以便访问我的缓存DataSource对象(以池化mysql连接).org.restlet.resource.Resource附带一个Context对象,但它与ServletContext没有任何关系.所以经过一些谷歌搜索后,我发现了以下内容:
final String contextKey = "org.restlet.ext.servlet.ServletContext";
final String poolKey = "MyCachedDBPool";
final Map<String, Object> attrs = getContext().getAttributes();
final ServletContext ctx = (ServletContext) attrs.get(contextKey);
if (ctx == null) {
throw new Exception("Cannot find ServletContext: " + contextKey);
}
final DataSource ds = (DataSource) ctx.getAttribute(poolKey);
if (ds == null) {
throw new DetourQAException("DataSource not stored in context"
+ poolKey + "attr");
}
Run Code Online (Sandbox Code Playgroud)
但它为ServletContext返回null.有没有人成功从restlet资源中访问ServletContext,你是怎么做到的?
如果这不是建议的连接池方法,那么在restlet中进行连接池的最佳方法是什么?
我想通过阅读文件的第一部分并分析内容来确定文件的类型(通常是UTF-8).(该类型特定于我的社区,但不在我的控制之下,并且不包含在MIME/MediaType中,通常是TEXT_PLAIN).我正在使用客户端上的'org.restlet'库来分析标头
Request request = new Request(Method.HEAD, url);
Run Code Online (Sandbox Code Playgroud)
所以我知道内容长度,并且可以(如果必要和可能)估计我应该为分析下载多少字节
澄清:我无法使用MediaType.从答案1看起来我必须得到内容.因此,修订后的问题是:
"我可以使用Restlet 获取文件的一部分吗?"
答案:以下代码可以满足我的需求.我已经将@BalusC归功于这种方式.如果我错过了任何内容,请评论:
public String readFirstChunk(String urlString, int byteCount) {
String text = null;
if (urlString != null) {
org.restlet.Client restletClient = new org.restlet.Client(Protocol.HTTP);
Request request = new Request(Method.GET, urlString);
List<Range> ranges = Collections.singletonList(new Range(0, byteCount));
request.setRanges(ranges);
Response response = restletClient.handle(request);
if (Status.SUCCESS_OK.equals(response.getStatus())) {
text = processSuccessfulChunkRequest(response);
} else if (Status.SUCCESS_PARTIAL_CONTENT .equals(response.getStatus())) {
text = processSuccessfulChunkRequest(response);
} else {
System.err.println("FAILED "+response.getStatus());
}
}
return text;
}
private String processSuccessfulChunkRequest(Response …Run Code Online (Sandbox Code Playgroud) 我有Camel路由,我想作为REST Web服务公开.应用程序部署在Web容器(Jetty/Tomcat)上,Spring也用于DI和其他"基础结构"事物.
我看了两个camel-restlet和camel-cxfrs组件,虽然它们都提供了作为REST服务公开路由的支持,但是我无法找到如何避免启动单独的服务器.我真正想要的是能够以类似于为Spring-WS入站端点定义路由的方式定义Camel路由,例如
from("restlet://application/user/{id}").to(...)
Run Code Online (Sandbox Code Playgroud)
Web应用程序的配置应该负责接受请求并将它们传输到适当的端点.
不得不承认我很惊讶我无法找到关于这个主题的足够信息,我不认为我的要求非常奇特.
我使用RESTFul服务作为我的前端的后端.该服务在其响应上设置expires/etag/lastmodified标头.
我正在寻找的是一个客户端(有利的java)库,它可以从服务中获取数据并将其缓存在可插入的缓存后端,如ehcache.
我还希望能够做的是在条目无效时使用后台工作线程自动填充缓存.此外,做条件GET应该是明智的.
我遇到过 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html
有没有人知道的其他图书馆?这不是一个相当普遍的问题吗?
首先,我需要说我在Google App Engine中没那么有经验.
我知道我们可以在GAE上部署RESTful Web服务(JERSEY)
而且我也知道RESTLET有一个专门针对GAE的版本.
我想从那些使用两种方法的人那里获得建议.
例如,为JERSEY配置GAE应用程序太困难或困难??? 或者例如使用RESTLET有什么缺点?还是太厚了(RESTLET)?
谢谢
我有一个Restlet(v2.1.1)组件,它使用ServerResource来处理HTTP GET请求.
我想将过滤器和/或路由器放入组件中,以便在请求到达ServerResource之前可以进行一些处理.
我一直在互联网上搜索这样做的例子,以及阅读"Restlet in Action"一书.我发现了一些有趣的东西:
有很多关于如何在组件中设置ServerResource的示例.
有很多关于如何创建和设置过滤器和路由器的示例.
不幸的是,我可能通过书籍和互联网搜索,我找不到使用两者的例子!
根据本书和Internet上的教程,我们应该能够创建一个组件,在组件中设置ServerResource,并使用过滤器来预处理发送到ServerResource的请求.没有任何文档似乎告诉我们如何做到这一点.
我误读了一切吗?是否真的没有办法将过滤器或路由器放在带有ServerResources的组件中?或者我错过了一些提供如何执行此操作的真实示例的文档?
有人可以提供一个简单的例子或提供一个这样做的例子的链接吗?
谢谢...
我试图使用RESTlet从Netsuite获取数据.为此,我在PHP中使用以下详细信息:
在第一次使用这些细节时,我得到的错误是无效的登录尝试.我发现它为什么会来,因为以下任何一个或所有错误的细节.
在给出正确的细节后,它工作正常,我将所有这些细节存储在DB中.我什么都没改变.但几天后我得到了同样的错误.
我想知道访问令牌是否会在几天后过期,或者为什么错误即将到来.
当它是多部分/表单数据请求时,如何捕获传入的@Post变量?
对于常规的Post请求,我会这样做:
@Post
public void postExample(Representation entity) throws Exception{
Form form = new Form(entity);
System.out.println(form.getFirstValue("something"));
}
Run Code Online (Sandbox Code Playgroud)
但由于它是一个multipart/form-data请求,因此上述输出为null
我是Java新手所以要温柔:)
PS:我对处理传入的文件,只是文本字段不感兴趣.
restlet ×10
java ×4
http ×2
apache-camel ×1
cxfrs ×1
http-caching ×1
http-headers ×1
jersey ×1
netsuite ×1
request ×1
response ×1
rest ×1
resteasy ×1
restlet-2.0 ×1
servlets ×1
spring ×1
url ×1
web-services ×1