我正在做一个个人项目,以学习如何使用Rest Web服务。
我有Visual的API Web应用程序,它是我的控制器,是与Oracle的连接地方,还有JAVA和JSON库的Web应用程序,此外还尝试根据我所学的知识分层进行在研究所。
[当我发出GET请求时,我没问题,他们带给我数据,但是当我以客户注册商的身份发出POST请求时,问题就开始了,并且我在Java中收到错误411。
我阅读了一些内容,通过放置“ Content-Length”来寻找对他们有用的解决方案,我不知道是否正确,但仍然存在问题。
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;
}
启用如下所示的日志记录:How to enable wire logging for a java HttpURLConnection traffic?
然后您将看到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");
with:
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 strips Content-Length header on Post:
Affects Version/s: 6u22
Status: Open
Resolution: Unresolved
BT2:评估
CR 6961084的修复程序限制某些可能对安全敏感的标头的设置。由于在以前的版本中允许设置这些标头,因此当然会实现兼容性。决定兼容性是这些标头带来的安全风险的第二要务。我们知道那里可能会影响有效的应用程序,因此添加了
sun.net.http.allowRestrictedHeaders
属性以还原为以前的行为。
BT2:周围的工作
使用
-Dsun.net.http.allowRestrictedHeaders=true
运行
我会不建议使用该解决方法。