javax.net.ssl.SSLException在Android中使用HttpPost请求

问题描述:

这里我写了代码来实现HttpPost在android中的请求,它应该在onClick方法之后运行。javax.net.ssl.SSLException在Android中使用HttpPost请求

那么,我没有得到解决方案,这是我试过的第三个程序,现在正在更新问题。

但我不知道每次我得到相同的error。请看看这种情况。

我相信,这些代码几乎是正确的,任何小的修正,都需要与我在这里所做的不同。

因为它可以在eclipse中作为简单的java程序正常工作,但android studio会抛出exception

这是onClick方法:

public void onClick(View v) { 
    inputSub = subIn.getText().toString(); 
    String url = "https://some_url"; 
    String inputJson = null; 

    try { 
     inputJson = "{ \"asset\": {\"id\": ..........}"; 
    }catch (JSONException e){ 
     e.printStackTrace(); 
    } 
    new CreateIncident(url, inputJson).execute(); 
} 

这是AsyncTask class

private class CreateIncident extends AsyncTask<Void, Void, Void> { 
    private final String TAG = "HttpClient"; 

    final String user ="some_user"; 
    final String password ="some_pwd"; 

    String serUrl; 
    String inputJson =""; 

    public CreateIncident(String serUrl, String inputJson) { 
     this.serUrl = serUrl; 
     this.inputJson = inputJson; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     // Showing progress dialog 
     pDialog = new ProgressDialog(CreateIncidentActivity.this); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
     String authString = user + ":" + password; 

     byte[] authBytes = authString.getBytes(); 
     String authStringEnc = Base64.encodeToString(authBytes, Base64.DEFAULT); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost postRequest = new HttpPost(serUrl); 

     postRequest.setHeader("Authorization", "Basic " + authStringEnc); 
     postRequest.setHeader("Accept", "application/json"); 
     postRequest.setHeader("Content-type", "application/json"); 

     StringEntity input = new StringEntity(inputJson); 

     input.setContentType("application/json"); 
     postRequest.setEntity(input); 

     HttpResponse response = httpClient.execute(postRequest); 

     StringBuilder sb = new StringBuilder(); 
     try { 
      BufferedReader reader = 
        new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 65728); 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
     } 
     catch (IOException e) { e.printStackTrace(); } 
     catch (Exception e) { e.printStackTrace(); } 


     System.out.println("finalResult " + sb.toString()); 
     System.out.println(response.getStatusLine().getReasonPhrase()); 

     if (response.getStatusLine().getStatusCode() != 201) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatusLine().getStatusCode()); 
     } 

     BufferedReader br = new BufferedReader(
       new InputStreamReader((response.getEntity().getContent()))); 


     httpClient.getConnectionManager().shutdown(); 

    } catch (MalformedURLException e) { 

     e.printStackTrace(); 

    } catch (IOException e) { 
     e.printStackTrace(); 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // Dismiss the progress dialog 
     if (pDialog.isShowing()) 
      pDialog.dismiss(); 

    } 
} 

在这里,我没有得到在Android MonitorstackTrace表现出任何异常,但调试后我发现它抛出异常

javax.net.ssl.SSLException: Read error: ssl=0xd6483780: I/O error during system call, Connection reset by peer

而且对于同一个程序,错误代码有所不同。

我无法找到我在这里做的错误。

请有人帮助我。

尝试通过加入这一行

useLibrary 'org.apache.http.legacy' 

到命名为机器人 对于实施例的第一个块/部分,以更新应用水平的build.gradle, :

apply plugin: 'com.android.application' 

    android { 
     useLibrary 'org.apache.http.legacy' 
     compileSdkVersion 26 
     buildToolsVersion "26.0.0" 
     defaultConfig { 
      applicationId "com.example.mnaum.getgpscoordinates" 
      minSdkVersion 15 
      targetSdkVersion 26 
      versionCode 1 
      versionName "1.0" 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     } 

并运行程序

+0

Thaks很多。通过添加这一行程序执行。但现在在这一行'HttpResponse response =(HttpResponse)httpclient.execute(httpPostRequest);''response'是_null_。而_error_是通过peer android'重置的javax.net.ssl.sslexception连接 – Shambhu