当前位置: 首页 > 面试题库 >

如何从Android进行HTTPS POST?

穆建元
2023-03-14
问题内容

我想执行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进行排序吗?

  • 问题内容: 我看了以下链接,但似乎没有什么具体的。 Android中的Secure HTTPPost 此功能不再起作用,我已经对其进行了测试,并且有其他人评论说它不起作用。 我也检查了一下:DefaultHttpClient,证书,Https和发布问题!这似乎可行,但Blogger只是让您感到困惑。更多分步说明会有所帮助。我未能通过他的第二步,因此设法获得了证书。 http://www.makeu

  • 本文向大家介绍如何使用Kotlin进行Android开发,包括了如何使用Kotlin进行Android开发的使用技巧和注意事项,需要的朋友参考一下 Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进。    Kotlin是由Jet

  • 如何使用RxJava的Android Room进行单行查询?我可以查询项目列表,没有问题。这里,我想找出是否存在特定的行。根据文档,如果不存在行,我可以返回Single并检查EmptyResultSetException异常。 我可以吃一些类似的东西: 如何使用此呼叫?看起来有一些onError/onSuccess,但在单个上找不到这些方法 任何可行的例子都会很好!

  • 我一直在使用CDIUnit和其他各种形式的CDI/SE解决方案来实现测试(junit),这些测试可以减少模拟,并更多地使用我的应用程序堆栈(我想是集成测试)。 无论如何,我也非常喜欢Spock进行测试,我认为应该抓紧时间从CDI/SE空间和Spock中混合一些东西,以便能够制定能够访问大部分CDI内容的规范。 许多CDI的单元运行程序(CDIUnit、WeldjUnit、deltaspike、为S