本文使用JAX-WS2.2編譯webservice,並使用HttpUrlConnection的POST方式對wsdl發送soap報文進行請求返回數據,html
對錯誤Server returned HTTP response code: 500 的解決方法進行簡單分析。java
因爲課程須要博主須要本身寫一個webservice而且經過soap進行請求,web
因而使用JAX-WS編譯了下面java代碼生成webservice服務數組
生成webservice的java代碼:瀏覽器
查看webservice服務器
在網上查到的一個方法就是經過HttpUrlConnection進行請求,這邊貼一下代碼,應該不少人都有查到相似的方法app
HttpUrlConnection請求實現代碼:url
soap.xml代碼以下:spa
這段代碼是網上找的,並無錯誤,可是一運行就懵逼了,報了下面的錯誤.net
明明直接在瀏覽器查看wsdl接口是能夠訪問頁面,可是返回500錯誤
錯誤代碼:
錯誤語句指向
而網上其餘大部分文章都沒有給解決方法,或者給了其餘的解決方法,我就在這邊分享一下這個問題的詳細解決方法。
首先應該確認具體的錯誤,經過下面的語句能夠了解InputStream的錯誤詳情。
這個語句其實也是從請求的服務方取回的錯誤信息,實質也是xml內容,用上面的BufferReader那一連串的語句解析出具體內容,而後輸出查看,具體代碼以下:
錯誤詳情輸出以下:
在這邊就要注意了!這個xml文件是第一個要點!
分析一下這段xml代碼,能夠看到有一個faultcode和faultstring,這就是解決這個問題的第一個突破口
靈光一閃百度了一下SOAP Fault(百科鏈接:http://baike.baidu.com/link?url=vehb23KNtl58uv2cwVDk8LYzDTUC4MHW9kmpaALl9qht9VXp8ASufe0QlpUrEELEApdKx80AMPzMsfCbUJtWiK)
這樣就一目瞭然了,錯誤代碼中faultcode所含的是Client,說明傳遞的消息有誤,服務端是沒有問題的。
因而從要發送的soap中查找錯誤。
這時候發現faultstring 「{}找不到xxx的分派方法」 中有一個大括號,想不明白那個是什麼,恰好查看了一下web服務的頁面,就是最上面那張圖片,發現服務名和端口名那邊也有大括號{http://example/},而後也想起來以前看的其餘xml代碼中,要發送的方法的那個節點中有寫命名空間(xmlns),就是網上那個getWeatherByCityName的那個例子,你們應該都有看過,我就再也不這邊費口舌了。
要是有仔細看我發送的soap.xml的代碼,就能夠看到sayHelloWorldFrom那個節點沒有寫命名空間,實在是查了這麼多代碼網上都沒人提到,也沒有查到關於soap報文的編寫規範,還覺得那邊能夠不用寫,因而刪掉了。
問題就出在這,我從新試了一下,先把命名空間隨便寫了個網址,再次運行後依然報錯,可是大括號中就有了命名空間指向的網址了,因而把web服務裏的大括號裏的地址,即{http://example/}寫上去,總算是請求成功併成功返回數據!
修改後的soap.xml(就是添加了命名空間)
大括號裏的地址其實就是wsdl中denfinition裏定義的targetNameSpace,具體解釋我貼個連接吧你們本身看吧,反正知道問題出在這邊總算是解決了。
WebService 之 WSDL文件 講解 http://blog.itpub.net/20200170/viewspace-740276/
其實出了bug第一反應確實應該是找Error信息,這樣纔好針對性的進行處理,若是本文的方法還沒辦法幫你解決的話,那仍是建議你們靠前面查看錯誤詳情的方法去進行bug的查找~
主要內容到這邊結束啦,但願能幫到你們~