因此,在我的网站上,我使用了几个不同的SSL cerficates。一个用于根域“illution.dk”,另一个用于我的子域“ci.illution.dk”。麻烦的是,当我使用HttpPost触发帖子请求时,我请求了一个像“https://ci.illution.dk/login/device”这样的URL,它只是抛出一条错误信息:
10-04 18:35:13.100: W/System.err(1680): javax.net.ssl.SSLException: hostname in certificate didn't match: <ci.illution.dk> != <www.illution.dk> OR <www.illution.dk> OR <illution.dk>
我认为这意味着它正在下载illution.dk的证书,然后看到它不支持ci.illution.dk。但是,当我加载浏览器并浏览到“https://ci.illution.dk”时,一切都很好。我的Android代码如下:
HttpClient httpclient = new DefaultHttpClient();
//appContext.getString(R.string.base_url)
HttpPost httppost = new HttpPost("https://ci.illution.dk/login/device");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("username", params[0]));
nameValuePairs.add(new BasicNameValuePair("password", params[1]));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
return response;
} catch (ClientProtocolException e) {
Log.d("ComputerInfo", "Error while loggin in: ClientProtocolException");
return null;
} catch (IOException e) {
Log.d("ComputerInfo", "Error while loggin in: IOException");
e.printStackTrace();
return null;
} catch (Exception e) {
Log.d("ComputerInfo", "Error while loggin in");
e.printStackTrace();
return null;
}
答案 0 :(得分:0)
只需看看下面的代码就可以得到答案。我在我的代码中使用过它。您必须在代码中使用。
BufferedReader reader = new BufferedReader(new InputStreamReader( 是,“iso-8859-1”),8);
StringBuilder sb = new StringBuilder();
String line = null;
while((line = reader.readLine())!= null){
sb.append(line +“\ n”);}
is.close();
看看我在其中使用的以下示例
ArrayList<DailyExpDto> list = new ArrayList<DailyExpDto>();
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("date", "" + date));
qparams.add(new BasicNameValuePair("uid", ""
+ Myapplication.getuserID()));
try {
HttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(null, -1),
new UsernamePasswordCredentials("YOURUSRNAME", "YOURPASSWORD"));
HttpPost httppost = new HttpPost(url + "daily_expenditure.php?");
httppost.setEntity(new UrlEncodedFormEntity(qparams));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
Log.v("log", result);
JSONObject jobj = null;
try {
jobj = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
try {
JSONArray JArray_cat = jobj.getJSONArray("category");
JSONArray JArray_desc = jobj.getJSONArray("description");
JSONArray JArray_exp = jobj.getJSONArray("expenditure");
for (int i = 0; i < JArray_cat.length(); i++) {
DailyExpDto dto = new DailyExpDto();
dto.category = JArray_cat.getString(i);
dto.desc = JArray_desc.getString(i);
dto.exp = JArray_exp.getInt(i);
list.add(dto);
}
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
答案 1 :(得分:0)
好吧,似乎HttpPost是一个错误,因为如果我使用链接here的代码,它就可以了。我修改了代码以满足我的特定需求,但这里是我的代码:(以防链接出现故障)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//do this wherever you are wanting to POST
URL url;
HttpURLConnection conn;
try{
//if you are using https, make sure to import java.net.HttpsURLConnection
url=new URL("https://ci.illution.dk/login/device");
//you need to encode ONLY the values of the parameters
String param="username=" + URLEncoder.encode("usernametest","UTF-8")+
"&password="+URLEncoder.encode("passwordtest","UTF-8");
conn=(HttpURLConnection)url.openConnection();
//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");
//Android documentation suggested that you set the length of the data you are sending to the server, BUT
// do NOT specify this length in the header by using conn.setRequestProperty("Content-Length", length);
//use this instead.
conn.setFixedLengthStreamingMode(param.getBytes().length);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//send the POST out
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.close();
//build the string to store the response text from the server
String response= "";
//start listening to the stream
Scanner inStream = new Scanner(conn.getInputStream());
//process the stream and store it in StringBuilder
while(inStream.hasNextLine())
response+=(inStream.nextLine());
Log.d("Test", response);
}
//catch some error
catch(MalformedURLException ex){
Toast.makeText(MainActivity.this, ex.toString(), 1 ).show();
}
// and some more
catch(IOException ex){
Toast.makeText(MainActivity.this, ex.toString(), 1 ).show();
}