2016-09-17 102 views
1

我正在測試連接到本地路由器的Android應用程序。在同一個WiFi網絡上也使用Restlets運行一些Java Web服務。我驗證了Android應用可以擊中服務過濾器,甚至可以接收來自服務過濾器的響應。但是,它似乎無法擊中有問題的Restlet服務。Android無法訪問在同一網絡上運行的Restlet服務

的完整URL服務:

http://192.168.0.148:8080/MyApp/service/login 

其中192.168.0.148是運行的Restlet的Web服務的計算機的本地IP地址。

我有我的Restlet Application類映射到的服務如下:

router.attach("/login", LoginResource.class); 

web.xml文件有相應的映射來路由任何與該模式/service/到的Restlet的servlet。

使用與上面給出的相同的URL從SOAP UI進行測試時,我可以成功地啓動此服務。事實上,所有的Web服務都已經使用SOAP UI進行了端對端測試,並且功能完整。

出於某種原因,Android應用程序可以打服務過濾器,當但當它達到:

chain.doFilter(request, response); 

請求結束了在太空中失去了,沒有東西返回。

我懷疑這在很大程度上是一個Reslets配置問題,儘管我不確切知道這裏發生了什麼。

+0

發佈您用於連接到服務器的代碼。你有超時錯誤嗎?你能否從服務器登錄以查看請求是否到達那裏? – nasch

+0

@nasch正如我所提到的,只要響應是從過濾器發送的,Android應用程序就可以發送和接收數據。但是,當過濾器鏈被轉發時,它永遠不會對'/ login'服務產生影響。 –

回答

0

我幾乎沒有反饋,無論是來自SO社區還是來自Restlets,這實際上是有道理的,因爲我在問題中報告的所有內容都是正確的。我決定將Restlet源文件附加到我的IntelliJ IDE中,並逐步完成代碼。我看到Tomcat日誌包含響應代碼415,並且通過檢查Restlets中的實際異常,我看到一個錯誤,指出我發佈的媒體類型是意外的。見狀,我立刻知道我做了什麼錯,這是:

  • 不發送正確的JSON的登錄服務
  • 未聲明的內容類型是JSON中的POST
  • 頭而所有這些使用的Restlet服務期待JSON


對於任何人誰面臨與使用JSON作爲Restlets類似的問題,下面的Android的代碼把一切都沒有問題的工作:

String endpoint = "http://192.168.0.148:8080/MyApp/service/login"; 
URL obj = new URL(endpoint); 
HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
con.setRequestMethod("POST"); 
con.setDoInput(true); 
con.setDoOutput(true); 
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 

JSONObject json = new JSONObject(); 
json.put("username", username); 
json.put("password", password); 
// etc.