作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在以下问题上被困了几个小时:
我目睹了以下行为:
所以我的问题是:触发这些行为的两个 POST 请求之间有什么区别?
这是输出(我们首先可以看到jetty发出的POST,然后是从导航器获取的html表单,最后是从导航器的POST
11:26:33.140 [main] INFO org.sample.Sample - launching server on port 8082
2015-07-29 11:26:33.203:INFO::main: Logging initialized @359ms
2015-07-29 11:26:33.375:INFO:oejs.Server:Thread-0: jetty-9.2.7.v20150116
2015-07-29 11:26:33.437:INFO:oejsh.ContextHandler:Thread-0: Started o.e.j.s.ServletContextHandler@24cca73f{/,null,AVAILABLE}
2015-07-29 11:26:33.437:INFO:oejs.ServerConnector:Thread-0: Started ServerConnector@746ab811{HTTP/1.1}{0.0.0.0:8082}
2015-07-29 11:26:33.437:INFO:oejs.Server:Thread-0: Started @609ms
11:26:35.312 [main] INFO org.sample.Sample - now posting
2015-07-29 11:26:35.687:INFO:/:qtp115342900-21: org.restlet.ext.servlet.ServerServlet-27a1f635: [Restlet] ServerServlet: component class is null
2015-07-29 11:26:35.734:INFO:/:qtp115342900-21: org.restlet.ext.servlet.ServerServlet-27a1f635: [Restlet] Attaching application: org.sample.MyApplication@6e47c1bf to URI:
11:26:35.828 [qtp115342900-21] INFO org.sample.Sample - proceeding POST
11:26:35.828 [qtp115342900-21] WARN org.sample.Sample - entity is null !
11:26:35.828 [qtp115342900-21] INFO org.sample.Sample - param p : toto
juil. 29, 2015 11:26:35 AM org.restlet.engine.log.LogFilter afterHandle
INFO: 2015-07-29 11:26:35 127.0.0.1 - 127.0.0.1 8082 POST /model p=toto 204 0 0 63 http://localhost:8082 Jetty/9.2.7.v20150116 -
juil. 29, 2015 11:26:39 AM org.restlet.engine.log.LogFilter afterHandle
INFO: 2015-07-29 11:26:39 127.0.0.1 - 127.0.0.1 8082 GET /model - 200 172 0 0 http://localhost:8082 Mozilla/5.0 (Windows NT 5.2; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0 -
11:26:43.515 [qtp115342900-22] INFO org.sample.Sample - proceeding POST
11:26:43.515 [qtp115342900-22] INFO org.sample.Sample - entity exists : [application/x-www-form-urlencoded,UTF-8]
11:26:43.515 [qtp115342900-22] INFO org.sample.Sample - param p : toto
juil. 29, 2015 11:26:43 AM org.restlet.engine.log.LogFilter afterHandle
INFO: 2015-07-29 11:26:43 127.0.0.1 - 127.0.0.1 8082 POST /model - 204 0 6 0 http://localhost:8082 Mozilla/5.0 (Windows NT 5.2; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0 http://localhost:8082/model
这是我的项目:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sample</groupId>
<artifactId>simple</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Jetty Server with Restlet Sample</name>
<properties>
<junit.version>4.12</junit.version>
<slf4j.version>1.7.7</slf4j.version>
<logback.version>1.1.2</logback.version>
<jdk.version>1.7</jdk.version>
<jetty.version>9.2.7.v20150116</jetty.version>
<restlet.version>2.2.2</restlet.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<!-- <finalName>atgm</finalName> -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.restlet.jee</groupId>
<artifactId>org.restlet</artifactId>
<version>${restlet.version}</version>
</dependency>
<dependency>
<groupId>org.restlet.jee</groupId>
<artifactId>org.restlet.ext.spring</artifactId>
<version>${restlet.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>
<version>${jetty.version}</version>
</dependency>
</dependencies>
src/main/java/org/sample/Sample.java
package org.sample;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.restlet.ext.servlet.ServerServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Sample {
private static final Logger LOGGER = LoggerFactory.getLogger(Sample.class);
private static final int PORT=8082;
private static Server server;
public static void main (String []args) throws Exception {
LOGGER.info("launching server on port "+PORT);
new Thread() {
@Override
public void run() {
try {
// now create the web server
server = new Server(PORT);
final ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
servletContext.setContextPath("/");
servletContext.setInitParameter("org.restlet.application", MyApplication.class.getName());
servletContext.addServlet(ServerServlet.class, "/*");
servletContext.addServlet(DefaultServlet.class, "/");
server.setHandler(servletContext);
server.start();
server.join();
} catch (Exception ex) {
LOGGER.info("Failed to start server", ex);
}
}
}.start();
HttpClient client = new HttpClient();
client.start();
// waiting for the server to be online
final int lapse = 2000;
Thread.sleep(lapse);
LOGGER.info("now posting");
client.POST("http://localhost:"+PORT+"/model")
.param("p", "toto")
.send();
}
}
src/main/java/org/sample/MyApplication.java
package org.sample;
import org.restlet.Application;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.routing.Router;
public class MyApplication extends Application {
public MyApplication () {
super();
}
public MyApplication (Context parentContext) {
super(parentContext);
}
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/model", MyResource.class);
return router;
}
}
src/main/java/org/sample/MyResource.java
package org.sample;
import org.restlet.data.Form;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyResource extends ServerResource {
private static final Logger LOGGER = LoggerFactory.getLogger(Sample.class);
@Post
public Representation acceptItem(Representation entity) throws Exception {
Representation result = null;
LOGGER.info("proceeding POST");
Form form;
if (null != entity) {
LOGGER.info("entity exists : "+entity.toString());
form = new Form(entity);
} else {
LOGGER.warn("entity is null !");
form = getReference().getQueryAsForm();
}
LOGGER.info("param p : "+form.getFirstValue("p"));
return result;
}
@Get("html")
public String represent() {
return "<html>"+
"<head><script src=\"http://code.jquery.com/jquery-1.11.3.min.js\"></script></head>"+
"<body>"+
"<button onclick=\"$.post('model',{p:'toto'});\">POST</button>"+
"</form>"+
"</body>"+
"</html>";
}
}
最佳答案
我不确切知道您如何从浏览器发出 POST 请求,但这里有一些提示:
getQuery()
对应于查询字符串中提供的元素。可能让您烦恼的是这些数据可以以表单的形式显示。事实上,Form
类与表单类似,并不一定与有效负载相对应。因此,如果您使用这样的 URL:http://localhost:8082/model?p=toto
,则参数 p
将出现在查询参数中接收到的表示(类似于getEntity()
)对应于有效负载。如果您使用内容类型 application/x-www-form-urlencoded
,它可以是一个表单,但通常它实际上不是一个表单。在第一种情况下,您可以从表示/实体创建一个 Form
实例。因此,如果您使用这样的请求,您的表示/实体中将有一个名为 p
的条目:
POST /model
Content-Type:application/x-www-form-urlencoded
p=toto
如果您想使用 Jetty 客户端创建此类请求,您需要像这样更新代码:
Field p = new Field("p", "toto");
Fields fields = new Fields();
fields.put(p);
client.POST("http://localhost:"+PORT+"/model")
.content(new FormContentProvider(fields))
.send();
希望对你有帮助蒂埃里
关于java - 使用 jetty 客户端发布会在 reSTLet 中给出空表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31696657/
我是一名优秀的程序员,十分优秀!