Eri*_*ing 11 java rest servlets
尝试使用HttpServlet#doPut从PUT请求获取参数:
public void doPut(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
// name is null
}
Run Code Online (Sandbox Code Playgroud)
使用curl发送请求:
curl -X PUT \
--data "name=batman" \
--header "Content-Type: text/plain" http://localhost:8080/sample.html
Run Code Online (Sandbox Code Playgroud)
使用doGet和GET curl请求可以正常工作.我错过了什么吗?
Eri*_*ing 21
根据评论和进一步的研究,我意识到Servlet不能假设任何有关放入服务器的数据,因此不会解析名称/值对.
以下解决方案似乎是处理通过PUT传递的任何数据的正确方法,并且可以解析为XML,Name/Value或其他任何数据.
BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream());
String data = br.readLine();
Run Code Online (Sandbox Code Playgroud)
与 indoGet()和doPost()方法不同,我们无法使用getParameter()indoPut()和doDelete()methods 方法获取请求参数。我们需要从输入流中手动检索它们。
以下方法检索请求参数并在映射中返回它们:
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;
}
Run Code Online (Sandbox Code Playgroud)
该示例使用 Google 的 Guava 库来解析参数。对于包含一个完整的例子doGet(),doPost(),doPut()和doDelete()方法,你可以阅读我的使用jsGrid教程。
| 归档时间: |
|
| 查看次数: |
16861 次 |
| 最近记录: |