2017-04-25 42 views
0

我已經部署了一個App Engine。我設置了SSL,並將其與自定義域相關聯。當我在本地開發應用程序時,通過http://localhost:8080/servlet發送到servlet,按預期工作,但是當我將它部署到App Engine時,我尚未得到適當的結果。我已經嘗試了很多東西,並且我收到的響應代碼是404或500.從Java客戶端應用程序發佈到Google App Engine上的Servlet的正確方法

我開始使用一個簡單的HTTPUrlConnection和DataOutputstream向該servlet發送JSON,並獲得相應的響應。像這樣:

URL url; 
    HttpURLConnection connection = null; 
    try { 
     url = new URL(targetURL); 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/json"); 
     connection.setRequestProperty("custom-Header", "XYZ"); 
     connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.length)); 
     connection.setRequestProperty("Content-Language", "en-US"); 

     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

     //Send request 
     DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
     wr.write(urlParameters); 
     wr.flush(); 
     wr.close(); 

     //Get Response  
     BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     while((line = rd.readLine()) != null) { 
      response.append(line); 
      response.append('\r'); 
     } 
     rd.close(); 
     return response.toString(); 

    } 
    finally { 
     if(connection != null) { 
      connection.disconnect(); 
     } 
    } 

這在當地有效。

現在我已經試過Apache工具的HttpAsyncClient,檢查它是否可能是時間問題:

 final ResponseObject responseObject = new ResponseObject(); //my simple POJO 

     try(CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom() 
      .setSSLStrategy(sslSessionStrategy) 
      .build()) { 

     httpclient.start(); 

     HttpPost post = new HttpPost(url); 
     post.setHeader("Content-Type", "application/json"); 
     post.setHeader("custom-Header", "XYZ"); 
     post.setHeader("Content-Language", "en-US"); 

     HttpEntity entity = new ByteArrayEntity(urlParameters); 
     post.setEntity(entity); 

     final CountDownLatch latch1 = new CountDownLatch(1); 
     httpclient.execute(post, new FutureCallback<HttpResponse>() { 

      public void completed(final HttpResponse response) { 
       int status = response.getStatusLine().getStatusCode(); 
       if (status >= 200 && status < 300) { 
        HttpEntity entity = response.getEntity(); 
        try { 
         responseObject.message = entity != null ? EntityUtils.toString(entity) : null; 
        } catch (ParseException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } else { 
        responseObject.exception = new ClientProtocolException("Unexpected response status: " + status); 
       } 

       latch1.countDown(); 
      } 

      public void failed(final Exception ex) { 
       responseObject.exception = ex; 
       latch1.countDown(); 
      } 

      public void cancelled() { 
       latch1.countDown(); 
      } 

     }); 

     latch1.await(); 
     if(responseObject.exception != null) { 
      throw responseObject.exception; 
     } else { 
      return responseObject.message; 
     } 
    } 

這也適用於本地,而是試圖達到AppEngine上,仍然沒有去當。

這裏是我的簡單的web.xml:

<servlet> 
    <servlet-name>login</servlet-name> 
    <servlet-class>my.servlet.package.LoginServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>login</servlet-name> 
    <url-pattern>/login</url-pattern> 
</servlet-mapping> 

<security-constraint> 
<web-resource-collection> 
    <web-resource-name>everything</web-resource-name> 
    <url-pattern>/*</url-pattern> 
</web-resource-collection> 
<user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
</user-data-constraint> 
</security-constraint> 

<welcome-file-list> 
    <welcome-file>home.jsp</welcome-file> 
</welcome-file-list> 

在本地,我張貼到http://localhost:8080/login。至於App Engine的,我貼到FF:

我試着改變了網址模式。我以/login開頭,然後確定登錄,然後明確嘗試了App Engine和自定義域名網址(即myapp.appspot.com/login和myapp.mydomain.com/login)。在嘗試沒有與servlet關聯的實際頁面(例如login.jsp或login.html)後,我也嘗試過使用實際的jsp或html頁面進行發佈。

當我使用HttpAsyncClient(由於SSLContext而選擇)時,我得到的最佳結果是與servlet相關的頁面的HTML,但從來沒有從Servlet中獲得我需要的響應。

任何想法?

+0

有人嗎?沒有人? –

回答

0

找到了答案,在谷歌雲平臺的零散文件之一: https://cloud.google.com/appengine/docs/standard/java/how-requests-are-handled https://cloud.google.com/appengine/docs/standard/java/how-requests-are-routed

基本上,你必須在前面加上你的項目的appspot網址,例如: myapp.appspot.com,以及您應用的任何主動投放實例的版本ID。您可以在App Engine控制檯的版本頁面下找到這樣的ID。例如:https://versionId.myapp.appspot.com

相關問題