如何从GAE servlet发送HTTPS请求?

问题描述 投票:1回答:2

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

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

它会崩溃

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

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

java google-app-engine https
2个回答
2
投票

我认为,objjava.net.URL类型。简单地说,在这种情况下你不应该使用javax.net.ssl.HttpsURLConnection

URL#openConnection()方法返回类型java.net.URLConnection,并没有提供它的子类型几乎任何保证(除了奇怪的javadoc描述,见下文*),谷歌使用它。您的申请不应该依赖于HttpsURLConnection的具体细节。有两种选择:

  • 仅使用URLConnection - 由API保证,
  • 使用HttpURLConnection作为URLFetchServiceStreamHandler$Connection扩展它,它不太可能被改变。

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

其他案例是GAE中的客户证书 - 请参阅qazxsw po问题。

*奇怪的是,Client Authentication by Certificate in GAE java的javadoc说:

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

(来源:URL.openConnection

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


0
投票

HttpURLConnection对我有用

© www.soinside.com 2019 - 2024. All rights reserved.