我正在尝试按以下方式发出https请求:
{
URL url;
String response = "";
try {
url = new URL(requestURL);
HttpsURLConnection connection = (HttspURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
int responseCode = connection.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
stringResponse = response;
} else {
stringResponse = "NONET";
Log.e(Constants.tag, requestURL + " HTTP ERROR: "
+ responseCode + "\n" + connection.getResponseMessage());
}
} catch (UnknownHostException net) {
Log.e(Constants.tag, requestURL + " HTTP ERROR", net);
stringResponse = "NONET";
} catch (SocketTimeoutException time) {
Log.e(Constants.tag, requestURL + " HTTP ERROR", time);
stringResponse = "NONET";
} catch (SSLHandshakeException e) {
Log.e(Constants.tag, requestURL + " HTTP ERROR", e);
stringResponse = null;
} catch (Exception e) {
Log.e(Constants.tag, requestURL + " HTTP ERROR", e);
stringResponse = null;
} finally {
received.set(true);
}
return response;
}
如果URL是http正常工作,但如果网址是https,我总是会收到以下错误。
E / NativeCrypto:ssl = 0x7f80a06f80 cert_verify_callback x509_store_ctx = 0x7f6afc02d8 arg = 0x0 E / NativeCrypto:ssl = 0x7f80a06f80 cert_verify_callback调用verifyCertificateChain authMethod = ECDHE_ECDSA
E / app标记:https://api(...)/all HTTP错误: 找不到404
我尝试从Android设备浏览器输入https网址并正确显示api。 (是json api)
答案 0 :(得分:2)
我已经为HTTPS服务器的所有POST / PUT / GET请求编写了一个函数
一个。您必须处理自签名证书。请确保包含该内容。
湾您必须告诉要将哪种类型的内容类型发送到服务器。
℃。取决于服务器配置。在处理Android请求之前,有什么要求您通过POSTMAN或curl命令向服务器发送检查以验证是否正常工作。
这是我的示例代码。
public String createConnection (String urlS, String methodInvoked,String patchBody, String postBody,String putBody){
URL url ;
BufferedReader br = null;
String toBeReturned="";
try {
url = new URL(urlS);
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] myTrustedAnchors = new X509Certificate[0];
return myTrustedAnchors;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Create an SSLContext that uses our TrustManager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setConnectTimeout(60000);
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
connection.setSSLSocketFactory(sc.getSocketFactory());
connection.setHostnameVerifier(hostnameVerifier);
if (patchBody != null ){
Log.i(TAG, " createConnection with PATH with body" );
connection.setRequestMethod("PATCH");
connection.setRequestProperty("data",patchBody);
connection.addRequestProperty("Content-Type", "application/json");
DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
dStream.writeBytes(patchBody);
dStream.flush();
dStream.close();
}
if (methodInvoked.equalsIgnoreCase("PATCH") && patchBody == null ){
Log.i(TAG, " createConnection with PATH without body" );
connection.setRequestMethod("PATCH");
// connection.addRequestProperty("Content-Type", "application/json");
// connection.setDoOutput(true);
}
if (postBody != null){
Log.i(TAG, " createConnection with POST with body" );
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
dStream.writeBytes(postBody);
dStream.flush();
dStream.close();
}
if (methodInvoked.equalsIgnoreCase("POST") && postBody == null ){
Log.i(TAG, " createConnection with POST without body" );
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//connection.addRequestProperty("Content-Type", "application/json");
}
if (putBody != null){
Log.i(TAG, " createConnection with PUT with body" );
connection.setRequestMethod("PUT");
connection.setDoOutput(true);
connection.addRequestProperty("Content-Type", "application/json");
DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
dStream.writeBytes(putBody);
dStream.flush();
dStream.close();
}
responseCode = connection.getResponseCode();
InputStream in= null;
if(responseCode >= HttpsURLConnection.HTTP_BAD_REQUEST)
{
in = connection.getErrorStream();
br = new BufferedReader( new InputStreamReader(connection.getErrorStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
}
String toBeReturned_1 = sb.toString();
Log.i(TAG, " createConnetion error received " + responseCode + " " + toBeReturned_1) ;
}
else{
br = new BufferedReader( new InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
}
toBeReturned = sb.toString();
}
} catch (MalformedURLException e) {
error = e.getMessage();
e.printStackTrace();
} catch (IOException e) {
error = e.getMessage();
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
if (br!=null)
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.i(TAG, " createConnetion finally returned" + toBeReturned );
return toBeReturned;
}
默认情况下,createconnection函数将执行GET请求
对于GET请求,请执行以下操作: -
String urlS_ = "https://google.com"; // your URI
String methodInvoked = "GET"
createConnection (urlS_, methodInvoked,null, null,null)
对于POST请求,请执行以下操作: -
String urlS_ = "https://gmail.com"; // your URI
String methodInvoked = "POST"
String postBody = postbody_; // Create a postbody_ which you want to create
createConnection (urlS_, methodInvoked,null, postBody ,null)
您可以根据需要修剪功能