我想执行HTTPS发布方法,以将一些数据从我的android应用发送到我的网站。
我HttpURLConnection
首先使用了它,并且可以与我的HTTP URL正常工作。我的生产网站位于HTTPS上,我想使用发送相同的POST
HttpsURLConnection
。有人可以帮助我正确使用课堂吗?
我在此链接中找到了一些来源:
KeyStore keyStore = ...;
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
URL url = new URL("https://www.example.com/");
HttpsURLConnection urlConnection = (HttpsURLConnection)
url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
InputStream in = urlConnection.getInputStream();
的值是 KeyStore keyStore = ...;
多少?
我尝试使用相同的发送数据 HttpURLConnection
,但是我看到一些POST数据丢失或错误。
我已经从这个问题尝试了方法。我在下面粘贴我的代码
String urlParameters="dateTime=" + URLEncoder.encode(dateTime,"UTF-8")+
"&mobileNum="+URLEncoder.encode(mobileNum,"UTF-8");
URL url = new URL(myurl);
HttpsURLConnection conn;
conn=(HttpsURLConnection)url.openConnection();
// Create the SSL connection
SSLContext sc;
sc = SSLContext.getInstance("TLS");
sc.init(null, null, new java.security.SecureRandom());
conn.setSSLSocketFactory(sc.getSocketFactory());
conn.setConnectTimeout(HTTP_CONNECT_TIME_OUT);
conn.setReadTimeout(HTTP_READ_TIME_OUT);
//set the output to true, indicating you are outputting(uploading) POST data
conn.setDoOutput(true);
//once you set the output to true, you don't really need to set the request method to post, but I'm doing it anyway
conn.setRequestMethod("POST");
conn.setFixedLengthStreamingMode(urlParameters.getBytes().length);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(urlParameters);
out.close();
InputStream is = conn.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response += inputLine;
}
我收到的错误如下:
05-12 19:36:10.758: W/System.err(1123): java.io.FileNotFoundException: https://www.myurl.com/fms/test
05-12 19:36:10.758: W/System.err(1123): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
05-12 19:36:10.758: W/System.err(1123): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
05-12 19:36:10.758: W/System.err(1123): at .httpRequest(SMSToDBService.java:490)
05-12 19:36:10.758: W/System.err(1123): at com..access$0(SMSToDBService.java:424)
05-12 19:36:10.758: W/System.err(1123): at com.$ChildThread$1.handleMessage(SMSToDBService.java:182)
05-12 19:36:10.758: W/System.err(1123): at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 19:36:10.758: W/System.err(1123): at android.os.Looper.loop(Looper.java:156)
05-12 19:36:10.758: W/System.err(1123): at com.$ChildThread.run(SMSToDBService.java:303)
您可以使用android设备中定义的默认CA,这对于任何公共网络都很好。
如果您具有自签名证书,则可以接受所有证书(风险较大,可以接受中间人攻击),也可以创建自己的证书TrustManagerFactory
,这不在此范围之内。
这是一些将默认CA用于https POST调用的代码:
private InputStream getInputStream(String urlStr, String user, String password) throws IOException
{
URL url = new URL(urlStr);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
// Create the SSL connection
SSLContext sc;
sc = SSLContext.getInstance("TLS");
sc.init(null, null, new java.security.SecureRandom());
conn.setSSLSocketFactory(sc.getSocketFactory());
// Use this if you need SSL authentication
String userpass = user + ":" + password;
String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
conn.setRequestProperty("Authorization", basicAuth);
// set Timeout and method
conn.setReadTimeout(7000);
conn.setConnectTimeout(7000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
// Add any data you wish to post here
conn.connect();
return conn.getInputStream();
}
阅读响应:
String result = new String();
InputStream is = getInputStream(urlStr, user, password);
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String inputLine;
while ((inputLine = in.readLine()) != null) {
result += inputLine;
}
问题内容: 我有一个指向COM接口的指针,想从其虚拟表中获取函数指针并进行方法调用。为此,我需要进行stdcall方法调用。在Go中,如何在cgo中使用约定stdcall进行呼叫或使用约定stdcall进行呼叫? 问题答案: 有关如何在Windows上调用stdcall函数的说明,请参见“ godoc syscall Proc”。请注意,* Proc.Call确实会分配/取消分配内存,因此,如果您
我已经制作了一个JsonObjects的jsonarray。现在我需要根据JSONObjects中的值对JSONArray进行排序。以前,我对自定义对象的ArrayLists进行排序,如下所示: 比较器: 然后对ArrayList进行排序: 有人知道如何对JSONArray进行排序吗?
如何使用RxJava的Android Room进行单行查询?我可以查询项目列表,没有问题。这里,我想找出是否存在特定的行。根据文档,如果不存在行,我可以返回Single并检查EmptyResultSetException异常。 我可以吃一些类似的东西: 如何使用此呼叫?看起来有一些onError/onSuccess,但在单个上找不到这些方法 任何可行的例子都会很好!
问题内容: 我看了以下链接,但似乎没有什么具体的。 Android中的Secure HTTPPost 此功能不再起作用,我已经对其进行了测试,并且有其他人评论说它不起作用。 我也检查了一下:DefaultHttpClient,证书,Https和发布问题!这似乎可行,但Blogger只是让您感到困惑。更多分步说明会有所帮助。我未能通过他的第二步,因此设法获得了证书。 http://www.makeu
本文向大家介绍如何使用Kotlin进行Android开发,包括了如何使用Kotlin进行Android开发的使用技巧和注意事项,需要的朋友参考一下 Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进。 Kotlin是由Jet
我一直在使用CDIUnit和其他各种形式的CDI/SE解决方案来实现测试(junit),这些测试可以减少模拟,并更多地使用我的应用程序堆栈(我想是集成测试)。 无论如何,我也非常喜欢Spock进行测试,我认为应该抓紧时间从CDI/SE空间和Spock中混合一些东西,以便能够制定能够访问大部分CDI内容的规范。 许多CDI的单元运行程序(CDIUnit、WeldjUnit、deltaspike、为S