Я пытаюсь вызвать внешний веб-сервис (не мой) из своего приложения GWT, работающего с App Engine.Почему я получаю ClassCastException с использованием HttpURLConnection в AppEngine?
Я знаю, что это невозможно сделать от клиента из-за SOP (политика одинакового происхождения), а RequestBuilder не является решением на сервере. Я последовал за учебник по the web site и using java.net а
Вот клиент
AsyncCallback<CustomObject> callback = new AsyncCallback<CustomObjectCustomObject>() {
@Override
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
@Override
public void onSuccess(CustomObject result) {
// code omitted
}
};
service.callMethod(aString, callback);
И это сервер
try {
String xmlRequest = "xmlToSend";
URL url = new URL("https://www.externalWebService.com");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setAllowUserInteraction(false);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type","application/soap+xml");
conn.setRequestProperty("Content-length", Integer.toString(xmlRequest.length()));
conn.setRequestProperty("charset", "utf-8");
conn.setConnectTimeout(10000);
OutputStream rawOutStream = conn.getOutputStream();
PrintWriter pw = new PrintWriter(rawOutStream);
pw.print(xmlRequest);
pw.flush();
pw.close();
if(conn.getResponseCode() != 200){
// Something...
}
Я держу имеющий ту же ошибку в conn.getResponseCode()
:
java.lang.ClassCastException: com.google.appengine.repackaged.org.apache.http.message.BasicHttpRequest cannot be cast to com.google.appengine.repackaged.org.apache.http.client.methods.HttpUriRequest
Без реального запроса удаленная служба работает хорошо: она может сериализовать и возвращать объекты клиенту. Проблема не связана с обменом данными между клиентом и сервером, это больше похоже на то, что AppEngine не поддерживает HttpURLConnection. Но это должно быть на сервере (не так ли?)
Любые мысли были бы высоко оценены! Заранее спасибо
Я не импортировал «переупакованную» версию Apache самостоятельно, я думаю, что это где-то в библиотеке AppEngine. – Felix
- Извините, я нажал слишком быстро - Поскольку я работаю с Maven, я добавил [зависимость от HTTP-клиента HTTP] (http://mvnrepository.com/artifact/com.google.http-client/google-http -client/1.20.0), но проблема остается. Наконец, я постараюсь сделать все возможное со ссылкой, которую вы мне дали. Это старый и иногда устаревший код, но если он все еще работает, я беру его. Спасибо вам за помощь! – Felix
@ Феликс уверен, что старый, но я использую его в производстве в течение многих лет без проблем! У службы fetch есть много досадных ограничений, и, кроме перехода на Compute Engine, мы не можем многое сделать ... – Marcelo