[错误411使用Java中的API(POST方法)

问题描述 投票:1回答:1

我正在做一个个人项目,以学习如何使用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;
    }
java json web-services asp.net-web-api webservice-client
1个回答
0
投票

启用如下所示的日志记录: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运行

我会建议使用该解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.