Android 向服务器发送HTTPS Post请求
这是我的HTTP JSONAndroid 向服务器发送HTTPS Post请求,android,Android,这是我的HTTP JSON { "User": { "Name": "Compulsary","Password": "Compulsary" } } 我必须使用HTTPS post请求将其发布到服务器。 当我尝试发送请求时,我得到SSL服务器证书异常。 如何解决此问题 我试过什么 我已尝试将HTTPPost与HTTPClient一起使用。SSL异常。 我还尝试使用URLConnection,忽略了SSL证书的检查。 我得到401和405响应码 问题陈述: 将上述PO
{
"User": {
"Name": "Compulsary","Password": "Compulsary" }
}
我必须使用HTTPS post请求将其发布到服务器。
当我尝试发送请求时,我得到SSL服务器证书异常。
如何解决此问题
我试过什么
我已尝试将HTTPPost
与HTTPClient
一起使用。SSL异常。
我还尝试使用URLConnection
,忽略了SSL证书的检查。
我得到401和405响应码
问题陈述:
将上述POST请求发送到服务器(请求是安全的,接受https)。
如何在android中实现这一点
我试过这个,我的代码,我得到405错误
// always verify the host - dont check for certificate
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
/**
* Trust every server - dont check for any certificate
*/
private static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
} };
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
private void makeRequest() {
URL url = null;
HttpsURLConnection urlConnection = null;
try {
url = new URL("https://wbapi.cloudapp.net:443/api/User/LocalLogin");
} catch (MalformedURLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
StringBuilder sb = new StringBuilder();
try {
trustAllHosts();
urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setHostnameVerifier(DO_NOT_VERIFY);
urlConnection.setDoOutput(true);
urlConnection
.setRequestProperty("Content-Type", "application/json");
urlConnection.setFixedLengthStreamingMode(urlConnection
.getContentLength());
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
urlConnection.connect();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JSONObject jsonParam = new JSONObject();
try {
jsonParam.put("Name", "dog");
jsonParam.put("Password", "123");
Log.v("Length", "" + urlConnection.getContentLength());
int HttpResult = urlConnection.getResponseCode();
Toast.makeText(LoginActivity.this, "Response" + HttpResult,
Toast.LENGTH_LONG).show();
if (HttpResult == HttpsURLConnection.HTTP_OK) {
System.out.println("ok");
Log.v("Hi", "" + "Trex");
BufferedReader br = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream(), "utf-8"));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
System.out.println("" + sb.toString());
Toast.makeText(LoginActivity.this, "" + sb.toString(),
Toast.LENGTH_LONG).show();
} else {
System.out.println("Here" + urlConnection.getResponseMessage());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Logcat条目
12-27 13:41:27.228: V/Length(3034): 72
12-27 13:41:27.248: I/System.out(3034): HereMethod Not Allowed
我正在使用以下代码进行https/http/wift/3G的组合,希望能有所帮助
public class CustomHttpClient {
private static DefaultHttpClient customHttpClient;
/** A private Constructor prevents instantiation */
private CustomHttpClient() {
}
public static synchronized DefaultHttpClient getHttpClient() {
if (customHttpClient == null) {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams.setUserAgent(params, "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1");
ConnManagerParams.setTimeout(params, 1000);
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 10000);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg);
customHttpClient = new DefaultHttpClient(conMgr, params);
}
return customHttpClient;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
样品呢
public static String Call(String URL, List<NameValuePair> postParameters)
{
BufferedReader in = null;
DefaultHttpClient httpClient;
StringBuffer sb = new StringBuffer();
try{
httpClient = CustomHttpClient.getHttpClient();
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); //making 3G network works*
HttpPost request = new HttpPost(URL);
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
request.setEntity(formEntity);
HttpResponse response = httpClient.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
}catch(Exception ex)
{
ex.printStackTrace();
}
return sb.toString();
}
公共静态字符串调用(字符串URL,列出后参数)
{
BufferedReader in=null;
默认httpClient httpClient;
StringBuffer sb=新的StringBuffer();
试一试{
httpClient=CustomHttpClient.getHttpClient();
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(),false);//使3G网络正常工作*
HttpPost请求=新的HttpPost(URL);
UrlEncodedFormEntity formEntity=新的UrlEncodedFormEntity(后参数);
请求。setEntity(formEntity);
HttpResponse response=httpClient.execute(请求);
in=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent());
字符串行=”;
字符串NL=System.getProperty(“line.separator”);
而((line=in.readLine())!=null){
sb.追加(行+NL);
}
in.close();
}捕获(例外情况除外)
{
例如printStackTrace();
}
使某人返回字符串();
}
步骤1:创建一个类mysslssocketfactory
,并包含以下代码:
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port,
autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
public class WebClientDevWrapper {
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
}
步骤2:创建一个类WebClientDevWrapper
,并包含以下代码:
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port,
autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
public class WebClientDevWrapper {
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
}
第3步:在活动内部或其他地方创建一个方法,此方法将用于进行web调用
/**
* Request JSON based web service to get response
*
* @param url
* - base URL
* @param request
* - JSON request
* @return response
* @throws ClientProtocolException
* @throws IOException
* @throws IllegalStateException
* @throws JSONException
*/
public HttpResponse request(String url, JSONObject request)
throws ClientProtocolException, IOException, IllegalStateException,
JSONException {
DefaultHttpClient client = (DefaultHttpClient) WebClientDevWrapper.getNewHttpClient();
HttpPost post = new HttpPost(url);
post.setEntity(new StringEntity(request.toString(), "utf-8"));
HttpResponse response = client.execute(post);
return response;
}
}
第4步:调用一个方法并获得响应。您应该尝试查看此处:但这并不是在所有情况下都有效。我查看了很多stackoverflow问题,没有一个是有用的,您需要尝试,如果没有任何帮助,请解释关于您的问题的更多细节,并在其他信息中显示您的代码。您能提供一些日志cat条目吗?获取405响应代码MySSLSocketFactory是什么?@RajeevNB oops我忘了,包括在步骤1中。检查JSONObject对象=新建JSONObject();请尝试{object.put(“Name”,“dog”);object.put(“Password”,“123”);}catch(JSONException e){//TODO自动生成的catch块e.printStackTrace();}JSON对象来获取我上面需要的JSON?是吗?@RajeevNB是的,看起来不错。我正在获取HTTPResponse对象。如何将其内容打印为字符串?还有一件事,我得到了响应。getStatusLine()为500/内部服务器错误?