2012-08-02 103 views
0

我正在为我们的Android设备创建应用程序。本节的目的是发布用户名和密码(目前只是以字符串形式分配)到Web服务并接收登录令牌。在运行代码时,在getOutputStream()行,我的代码终止并且不再有任何进展。Java应用程序终止于getOutputStream()

我已经分配了android模拟器的GSM访问权限,并在Eclipse中设置了代理和DNS服务器。我不确定现在该去哪里!

这是我onHandleIntent内():

protected void onHandleIntent(Intent i) { 
    try{ 

     HttpURLConnection http_conn = (HttpURLConnection) new URL("http://www.XXXXX.com").openConnection(); 

     http_conn.setRequestMethod("POST"); 
     http_conn.setDoInput(true); 
     http_conn.setDoOutput(true); 
     http_conn.setRequestProperty("Content-type", "application/json; charset=utf-8"); 

     String login = URLEncoder.encode("XXXXX", "UTF-8") + "=" + URLEncoder.encode("XX", "UTF-8"); 
     login += "&" + URLEncoder.encode("XXXXX", "UTF-8") + "=" + URLEncoder.encode("XX", "UTF-8"); 



     OutputStreamWriter wr = new OutputStreamWriter(http_conn.getOutputStream()); 
     //TERMINATES HERE 
     wr.write(login); 
     wr.flush(); 

     BufferedReader rd = new BufferedReader(new InputStreamReader(http_conn.getInputStream())); 
     String line = rd.toString(); 

     wr.close(); 
     rd.close(); 

     http_conn.disconnect(); 
     } 
     catch (IOException e){ 
     } 
} 

这是我的java先走,只写了这几天如此忍受我,如果我错过了一些东西明显。

谢谢

+2

抛出的错误是什么? – Razvan 2012-08-02 12:19:04

+0

这是一个非常重要的问题,getOutputStream()方法defautl实现抛出'UnknownServiceException(“协议不支持输出”) – 2012-08-02 12:29:58

+0

也永远不会错误关闭你的流在finally块 – 2012-08-02 12:37:09

回答

1

如果您想使用HTTP POST某些内容,为什么不使用HTTP POST? ;-)

下面是一个例子片段:

public void postData() { 
    // Create a new HttpClient and Post Header 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

    try { 
     // Add your data 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
     nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     // Execute HTTP Post Request 
     HttpResponse response = httpclient.execute(httppost); 

    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
    } 
} 

来源:http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient

+0

如果你想使用HTTP POST一些东西,为什么不使用HTTP POST?解决这个问题的一个答案可能是android家伙要求开发者通过HttpClient使用HttpUrlConnection。然而,对于任一API的表现都存在矛盾的观点。 – Dexter 2014-12-17 20:28:54

+0

你能否告诉我“安卓家伙”在哪里要求开发人员通过HttpClient使用HttpUrlConnection?我很感兴趣。 – chrulri 2015-01-07 13:00:13

+0

@chruli http://developer.android.com/training/basics/network-ops/connecting.html#http-client – Dexter 2015-01-08 08:57:20

1

这可能不是合适的答案,但肯定对你有所帮助。我已经使用这个代码发送和接收请求并回复给web服务。

此代码正在工作,但将需要一些Refactoring,因为我已经使用了一些额外的变量,这是不需要的。

我已经使用了NameValuePair这里发表

public String postData(String url, String xmlQuery) { 



     final String urlStr = url; 
     final String xmlStr = xmlQuery; 
     final StringBuilder sb = new StringBuilder(); 


     Thread t1 = new Thread(new Runnable() { 

      public void run() { 

       HttpClient httpclient = new DefaultHttpClient(); 


       HttpPost httppost = new HttpPost(urlStr); 


       try { 

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
          1); 
        nameValuePairs.add(new BasicNameValuePair("xml", xmlStr)); 

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

        HttpResponse response = httpclient.execute(httppost); 

        Log.d("Vivek", response.toString()); 

        HttpEntity entity = response.getEntity(); 
        InputStream i = entity.getContent(); 

        Log.d("Vivek", i.toString()); 
        InputStreamReader isr = new InputStreamReader(i); 

        BufferedReader br = new BufferedReader(isr); 

        String s = null; 


        while ((s = br.readLine()) != null) { 

         Log.d("YumZing", s); 
         sb.append(s); 
        } 


        Log.d("Check Now",sb+""); 




       } catch (ClientProtocolException e) { 

        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } /* 
       * catch (ParserConfigurationException e) { // TODO 
       * Auto-generated catch block e.printStackTrace(); } catch 
       * (SAXException e) { // TODO Auto-generated catch block 
       * e.printStackTrace(); } 
       */ 
      } 

     }); 

     t1.start(); 
     try { 
      t1.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     System.out.println("Getting from Post Data Method "+sb.toString()); 

     return sb.toString(); 
    } 
1
String line = rd.toString(); 

应该

String line = rd.readLine(); 

可能做的伎俩。 rd.toString()为您提供BufferedReader的字符串表示。它不会触发HTTP操作。我没有测试你的代码,所以可能还有其他错误,这只是一个明显的错误。

+0

感谢您的建议,我会看看readLine()并将其更改! – Seb 2012-08-02 12:40:29