我正在做一个个人项目,学习如何使用Rest Web服务。
我在可视化中有一个API Web应用程序,它是我的控制器,可以连接到Oracle,还有一个JAVA中的Web应用程序,并且带有JSON库,此外还尝试根据我在研究所学到的知识分层执行。
当我发出 GET 请求时,我没有问题,他们给我带来了数据,但是当我作为客户的注册商发出 POST 请求时,就是问题开始的时候,我在 java 中收到错误 411。
我阅读寻找解决方案,有些人通过放置"内容长度"为他们工作,我不知道我是否说对了,但我仍然有问题。
public int insertarCliente(Cliente c){
globalURL += "?rut=" + c.getRut() + "&nom="+ c.getNombre() +"&app=" + c.getApellidoP() + "&apm=" + c.getApellidoM();
try {
HttpURLConnection conn = Conectar(globalURL);
conn.setRequestMethod("POST");
conn.setRequestProperty("ACCEPT", "application/json");
conn.setRequestProperty("Content-Length", "0");
if (conn.getResponseCode() == 200) {
//InputStreamReader in = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = br.readLine();
JSONObject obj = new JSONObject(resp);
return obj.getInt("resp");
}
} catch (Exception e) {
Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, e);
}
return 0;
}
问题始于 IF。
显示我的错误如下:
Glook2 was successfully deployed in 227 milliseconds.
**Grave: java.lang.RuntimeException: Failed : HTTP Error code : 411**
at Controllers.ClienteDAO.insertarCliente(ClienteDAO.java:50)
at Services.cliente.registrar(cliente.java:104)
at Services.cliente.processRequest(cliente.java:46)
at Services.cliente.doPost(cliente.java:77)
我必须强调,我已经在 POSTMAN 中证明了 Web 服务方法有效并正确地将数据添加到数据库中。
String globalURL = "http://localhost:60367/api/Cliente";
HttpURLConnection conn;
public ClienteDAO() {
conn = Conectar(this.globalURL);
}
private HttpURLConnection Conectar(String urlRest) {
try {
URL url;
url = new URL(urlRest);
return (HttpURLConnection) url.openConnection();
} catch (Exception e) {
Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, e);
}
return null;
}
启用日志记录,如下所示:如何为 java HttpURLConnection 流量启用有线日志记录?
然后,您将看到1,表示未发送Content-Length
标头:
FINE: sun.net.www.MessageHeader@4bf558aa5 pairs:
{POST / HTTP/1.1: null}
{ACCEPT: application/json}
{User-Agent: Java/13}
{Host: localhost:8080}
{Connection: keep-alive}
1:示例日志条目,换行以便于阅读
这是因为HttpURLConnection
管理该标头。
要发送Content-Length: 0
标头,不发送任何输出,即替换:
conn.setRequestProperty("Content-length", "0");
跟:
conn.setDoOutput(true);
conn.getOutputStream().close();
日志记录现在显示标头:
FINE: sun.net.www.MessageHeader@5fa7e7ff7 pairs:
{POST / HTTP/1.1: null}
{ACCEPT: application/json}
{User-Agent: Java/13}
{Host: localhost:8080}
{Connection: keep-alive}
{Content-type: application/x-www-form-urlencoded}
{Content-Length: 0}
另请参阅:JDK-6997628:HttpURLConnection在帖子中剥离Content-Length标头:
Affects Version/s: 6u22
Status: Open
Resolution: Unresolved
BT2:评估
CR 6961084的修复限制了某些潜在安全敏感标头的设置。由于这些标头允许在以前的版本中设置,因此兼容性当然会受到影响。已决定兼容性是这些标头带来的安全风险的次要因素。我们知道,可能存在受此影响的有效应用,因此添加了
sun.net.http.allowRestrictedHeaders
属性以恢复到以前的行为。
BT2:解决方法
与
-Dsun.net.http.allowRestrictedHeaders=true
一起运行
我不建议使用该解决方法。