如何从GAE servlet发送HTTPS请求?

时间:2015-08-17 09:09:34

标签: java google-app-engine https

我尝试使用GAE技术发送https请求。但是,如果我使用

HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

它会崩溃

  

java.lang.ClassCastException:   com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler $连接   无法转换为javax.net.ssl.HttpsURLConnection

如果我将HttpsURLConnection更改为HttpURLConnection,一切都会正常,但我不认为会使用https优势。那么如何正确发送https请求呢?

2 个答案:

答案 0 :(得分:2)

我认为,[ { "Id": "1", "Nome": "Bing", "NomeBuscaNaApi": "", "NomeResource": "Bing", }, { "Id": "2", "Nome": "Personalizado", "NomeBuscaNaApi": "", "NomeResource": "Personalizado", }, ... ] 属于obj类型。 简单来说,在这种情况下你不应该使用java.net.URL

javax.net.ssl.HttpsURLConnection方法返回类型URL#openConnection(),并且几乎不提供任何子类型保证(除了奇怪的javadoc描述,请参阅下面的*),Google使用它。 您的申请不应该依赖java.net.URLConnection的具体内容。有两种选择:

  • 仅使用HttpsURLConnection - 由API保证,
  • 使用URLConnection,因为HttpURLConnection扩展了它,并且不太可能被更改。

在这两种情况下,都会使用HTTPS功能;铸造不会改变物体的性质。

其他情况是GAE中的客户证书 - 请参阅Client Authentication by Certificate in GAE java queston。

*奇怪的是,URLFetchServiceStreamHandler$Connection的javadoc说:

  

如果对于URL的协议(例如HTTP或JAR),存在属于以下某个包或其子包之一的公共专用URLConnection子类:java.lang,java.io,java .util,java.net,返回的连接将是该子类。例如,对于HTTP,将返回HttpURLConnection,对于JAR,将返回JarURLConnection。

(来源:https://docs.oracle.com/javase/8/docs/api/java/net/URL.html#openConnection

HttpsConnction不在任何提及的包中,因此Google可以自由提供它想要的任何类型。但是这样的描述可以在将来添加URL.openConnection - 例如 - HttpsURLConnection包,然后AppEngine实现将不再相关。这只是猜测,很可能永远不会发生 - 但不能保证! :)

答案 1 :(得分:0)

HttpURLConnection对我有用