HttpURLConnection 411錯誤解決

來源:互聯網
上載者:User

標籤:put   puts   trail   請求   大量   傳輸   over   rail   個人   

1.問題描述

Java HttpURLConnection類發送Http請求連結外網返回ResponseCode為411,對方為.NET伺服器,網上查明原因可能來自以下:

1、可能是沒有傳http中的content-length參數,這個一般都有。
2、可能是因為請求方式錯誤的,本來只是擷取資料,應該使用GET的方式;但是你使用的是POST的方式。

首先第一個方法:

conn.setRequestProperty("Content-Length", ""+info.getBytes().length);

設定後還是411錯誤

第二個方法:將請求方式改為GET, 成功。

但聯調方反饋請求方式沒有變,依然為POST,很納悶.....下班後,用瀏覽器Http線上測試載入器試了一下,發現添加參數Content-Length後,POST方式也能請求成功。

反過來,列印日誌,發現屬性"Content-Length"為NULL...也就是HTTPURLConnection調用setRequestProperty無效。所以這裡也提醒自己,自測萬無一失能避免溝通浪費。

這裡推薦http測試用fiddler。定位到問題就好查了。

http://blog.csdn.net/Feng______/article/details/38301293 這個人總結的很好,自己也去看了源碼。

 private static final Set<String> restrictedHeaderSet;    private static final String[] restrictedHeaders = {/* Restricted by XMLHttpRequest2 *///"Accept-Charset",//"Accept-Encoding","Access-Control-Request-Headers","Access-Control-Request-Method","Connection", /* close is allowed */"Content-Length",//"Cookie",//"Cookie2","Content-Transfer-Encoding",//"Date","Expect","Host","Keep-Alive","Origin",// "Referer", // "TE","Trailer","Transfer-Encoding","Upgrade",//"User-Agent","Via"    };

在靜態初始化代碼中發現allowRestrictedHeaders是由安全管理器的傳回值決定的。

restrictedHeaderSet的內容是由restrictedHeaders數組決定的。

大概原因就是出於安全考慮,這些欄位盡量不要被改動。sun就做了這一套安全機制。

解決方案是在JVM啟動時加入sun.NET.http.allowRestrictedHeaders屬性為true。

First, the order of the headers is irrelevant.Second, in order to manually override the host header you need to set sun.net.http.allowRestrictedHeaders=trueeither in code

直接在程式裡面加下面代碼。然後就OK了。

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

HttpURLConnection介面

http://www.cjsdn.net/doc/jdk50/java/net/HttpURLConnection.html

http://www.cnblogs.com/skyaccross/archive/2012/12/22/2828986.html

 

2. DoOutput和DoInput說明

httpUrlConnection.setDoOutput(true)

httpUrlConnection.setDoInput(true)

這兩個方法在develope的httpUrlConnection方法中找不到的。

get請求用不到conn.getOutputStream(),因為參數直接追加在地址後面,因此預設是false。

post請求(比如:檔案上傳)需要往服務區傳輸大量的資料,這些資料是放在http的body裡面的,因此需要在建立串連以後,往服務端寫資料。  

因為總是使用conn.getInputStream()擷取服務端的響應,因此預設值是true。

HttpURLConnection 411錯誤解決

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.