我從網站的API使用HTTP獲取JSON。這是開發測試網址。主機名<URL>未通過org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname驗證
public static final String BASE_URL = "http://...."
我正在使用POST請求。
private Response sendRequest(Request request, boolean debug)
throws Exception {
HttpURLConnection conn = null;
Response response = null;
long time = 0;
try {
conn = (HttpURLConnection) request.getUrl().openConnection();
if (request.headers != null) {
for (String header : request.headers.keySet()) {
conn.addRequestProperty(header, request.headers.get(header));
}
}
time = System.currentTimeMillis();
conn.setDoOutput(false);
if (request instanceof POST) {
byte[] payload = ((POST) request).body;
conn.setDoOutput(true);
conn.setFixedLengthStreamingMode(payload.length);
conn.getOutputStream().write(payload);//line69
}
int status = conn.getResponseCode();
if (status != HttpURLConnection.HTTP_OK)
response = new Response(status, conn.getResponseMessage()
.getBytes());
else {
if (conn.getContentType().contains("application/json")) {
response = new Response(status, readInputStream(
conn.getInputStream()).getBytes());
} else {
response = new Response(status,
readInputStreamWithoutUTF8(conn.getInputStream()));
}
}
response.contentType = conn.getContentType();
response.contentLength = conn.getContentLength();
response.time = System.currentTimeMillis() - time;
if (debug)
dumpRequest(request, response);
} catch (IOException e) {
e.printStackTrace(System.err);
throw e;
} finally {
if (conn != null)
conn.disconnect();
}
return response;
}
一切正常工作與測試URL。但文件說,使用隔離URL是
public static final String BASE_URL = "https://..."
當我改變測試URL發佈URL,應用程序是給下面的異常
07-07 11:06:17.515: W/System.err(23000): java.io.IOException: Hostname '...........' was not verified 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:69) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:41) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 11:06:17.531: W/System.err(23000): at java.lang.Thread.run(Thread.java:1019) 07-07 11:06:17.531: W/System.err(23000): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 11:06:17.539: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:69) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:41) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 11:06:17.554: W/System.err(23000): at java.lang.Thread.run(Thread.java:1019)
我覺得這條線會導致錯誤:
conn.getOutputStream().write(payload);
我使用這個exeption,發現不同的建議。老實說,我不明白如何將這些代碼應用到我的應用程序中。
有人可以解釋如何將HTTP連接更改爲HTTPS連接? 謝謝你寶貴的時間!
以防萬一,我使用三星Galaxy王牌了Android 2.3.6
更新:使用的HostnameVerifier
private Response sendRequest(Request request, boolean debug)
throws Exception {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv =
HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify("my.gov.uz", session);
}
};
HttpsURLConnection conn = null;
Response response = null;
long time = 0;
try {
conn = (HttpsURLConnection) request.getUrl().openConnection();
conn.setHostnameVerifier(hostnameVerifier);
if (request.headers != null) {
for (String header : request.headers.keySet()) {
conn.addRequestProperty(header, request.headers.get(header));
}
}
time = System.currentTimeMillis();
conn.setDoOutput(false);
if (request instanceof POST) {
byte[] payload = ((POST) request).body;
conn.setDoOutput(true);
conn.setFixedLengthStreamingMode(payload.length);
conn.getOutputStream().write(payload);
}
int status = conn.getResponseCode();
if (status != HttpURLConnection.HTTP_OK)
response = new Response(status, conn.getResponseMessage()
.getBytes());
else {
if (conn.getContentType().contains("application/json")) {
response = new Response(status, readInputStream(
conn.getInputStream()).getBytes());
} else {
response = new Response(status,
readInputStreamWithoutUTF8(conn.getInputStream()));
}
}
response.contentType = conn.getContentType();
response.contentLength = conn.getContentLength();
response.time = System.currentTimeMillis() - time;
if (debug)
dumpRequest(request, response);
} catch (IOException e) {
e.printStackTrace(System.err);
throw e;
} finally {
if (conn != null)
conn.disconnect();
}
return response;
}
更新代碼,但仍然得到同樣的exeption:
07-07 12:39:30.882: W/System.err(25360): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:85) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:46) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 12:39:30.890: W/System.err(25360): at java.lang.Thread.run(Thread.java:1019) 07-07 12:39:30.898: W/System.err(25360): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 12:39:30.898: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:85) 07-07 12:39:30.898: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:46) 07-07 12:39:30.921: W/System.err(25360): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 12:39:30.921: W/System.err(25360): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 12:39:30.921: W/System.err(25360): at java.lang.Thread.run(Thread.java:1019)
我沒有訪問服務器。我只能從客戶端訪問。在這種情況下我能做什麼? –
您是否已閱讀鏈接後的文檔?它描述瞭如何解決客戶端的問題。它建議使用[HttpsUrlConnection](https://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html)或使用自定義[HostnameVerifier](https://developer.android.com/reference/ javax/net/ssl/HostnameVerifier.html),以防萬一[這裏是我正在談論的鏈接](https://developer.android.com/training/articles/security-ssl.html#CommonHostnameProbs) – Chaosit
我有二手hostNameVerfier選項:的HostnameVerifier的HostnameVerifier =新的HostnameVerifier(){ \t \t @Override \t \t公共布爾驗證(字符串主機名,會話的SSLSession){ \t \t的HostnameVerifier HV = \t \t HttpsURLConnection.getDefaultHostnameVerifie R(); \t \t return hv.verify(「my.gov。UZ」,會議); \t \t} \t \t}; \t \t HttpsURLConnection的康恩= NULL; \t \t響應響應= NULL; \t \t長時間= 0; \t \t嘗試{ \t \t \t \t \t \t conn =(HttpsURLConnection)request.getUrl() .openConnection(); \t \t \t conn.setHostnameVerifier(hostnameVerifier);但它仍然給出同樣的例外。 –