我正在尝试使用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请求呢?
我认为,obj
是java.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实现将不再相关。这只是猜测,很可能永远不会发生 - 但不能保证! :)
HttpURLConnection对我有用