我已經部署了一個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中獲得我需要的響應。
任何想法?
有人嗎?沒有人? –