Servlet参数和doPut
尝试使用HttpServlet#doPut从PUT请求获取参数:
public void doPut(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
// name is null
}
使用curl发送请求:
curl -X PUT
--data "name=batman"
--header "Content-Type: text/plain" http://localhost:8080/sample.html
使用doGet和GET curl请求可以很好地工作。 我错过了什么吗?
根据评论和进一步的研究,我意识到Servlet不能假设任何有关将数据放入服务器的内容,因此不会分析名称/值对。
下面的解决方案似乎是处理通过PUT传递的任何数据的正确方法,并且可以解析为XML,名称/值或其他。
BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream());
String data = br.readLine();
与doGet()
和doPost()
方法不同,我们无法使用doPut()
和doDelete()
方法中的getParameter()
方法获取请求参数。 我们需要从输入流手动检索它们。
以下方法检索请求参数并将它们返回到映射中:
public static Map<String, String> getParameterMap(HttpServletRequest request) {
BufferedReader br = null;
Map<String, String> dataMap = null;
try {
InputStreamReader reader = new InputStreamReader(
request.getInputStream());
br = new BufferedReader(reader);
String data = br.readLine();
dataMap = Splitter.on('&')
.trimResults()
.withKeyValueSeparator(
Splitter.on('=')
.limit(2)
.trimResults())
.split(data);
return dataMap;
} catch (IOException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.WARNING, null, ex);
}
}
}
return dataMap;
}
该示例使用Google的Guava库来解析参数。 对于包含doGet()
, doPost()
, doPut()
和doDelete()
方法的完整示例,您可以阅读我的使用jsGrid教程。
doPut()
意味着什么不起作用? 据我所知,它不像doGet()
或doPost()
,你有请求参数和东西。
PUT可以用来把东西放在服务器上。 特别是,PUT操作允许客户端将文件放置在服务器上,并且类似于通过FTP发送文件。 看看这个例子,我在JGuru上找到了。
->GET /file.dat HTTP/1.1
<-HTTP/1.1 404 Not Found
->PUT /file.dat HTTP/1.1
Content-Length: 6
Content-Type: text/plain
Hello!
<-HTTP/1.1 200 OK
->GET /file.dat HTTP/1.1
<-HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Hello!
链接地址: http://www.djcxy.com/p/41027.html