HttpUrlConnection在单个连接中发送多个post请求

时间:2016-09-16 20:57:26

标签: java http-post persistence httpconnection

我想在一个HTTP连接中进行多个post调用,

  1. 我将发送Arraylist<String>httpConnection个对象作为输入参数。
  2. 迭代ArrayList并将请求写入服务器。
  3. 我最终收到以下错误:

    Cannot write output after reading input.
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
    

    这是我的代码。我用来完成上述任务。

    public boolean sendToLogsAPI(ArrayList<String> logList, HttpURLConnection conn) throws IOException
    {
        try 
        {
             DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
             for(int i=0; i<logList.size(); i++)
             {
                 wr = new DataOutputStream(conn.getOutputStream());
                 wr.writeBytes(logList.get(i));
                 wr.flush();
                 int nothing = conn.getResponseCode();
                 String morenothing = conn.getResponseMessage();
             }   
             wr.flush();
             wr.close();
        }
        catch (Exception e) 
        {
          e.printStackTrace();
        } 
        finally 
        {
          if(conn != null) 
          {
            conn.disconnect(); 
          }
        }
    
        return false;
    }
    

    我如何克服这种情况?

2 个答案:

答案 0 :(得分:2)

根据HttpURLConnection

的javadoc
  

每个HttpURLConnection实例用于发出单个请求

有关详细信息,请参阅this

问题是,您完成conn.getOutputStream()后无法执行wr.flush()

如果要发送其他帖子请求,则必须创建HttpURLConnection的新实例。您可以通过多种方式完成此操作。一种方法是创建一个方法getHttpURLConnection(),每次都提供新的连接[如果你展示如何创建HttpURLConnection的实例,并将其传递给方法sendToLogsAPI(),那么我可以告诉你getHttpURLConnection()的实现也是如此。]并修改现有代码如下:

public boolean sendToLogsAPI(ArrayList<String> logList) throws IOException
{
    DataOutputStream wr = null;
    HttpURLConnection conn = null;

    try 
    {
         for(int i=0; i<logList.size(); i++)
         {
             conn = conn("<Some-URL>","<API-Key>","<GUID>");
             wr = new DataOutputStream(conn.getOutputStream());
             wr.writeBytes(logList.get(i));
             wr.flush();
             int nothing = conn.getResponseCode();
             String morenothing = conn.getResponseMessage();
         }   
         if(wr != null) {
             wr.close();
         }
    }
    catch (Exception e) 
    {
      e.printStackTrace();
    } 
    finally 
    {
      if(conn != null) 
      {
        conn.disconnect(); 
      }
    }

    return false;
}

我想问你的另一个问题是你为什么要使用相同的HttpURLConnection实例。即使您使用多个,也可以使用相同的Socket(和底层TCP)。因此,请不要担心HttpURLConnection的多个实例。

答案 1 :(得分:0)

您正在使用此方法关闭连接,因此无法使用相同的HttpURLConnection conn

调用两次

您可能不应断开此处的连接conn.disconnect();,而是将其留给来电者。