当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection POST请求引发IOException

贺波
2023-03-14

我试图使用android HttpUrlConnection进行POST请求。首先,我从这里使用GET请求的示例:

http://developer.android.com/training/basics/network-ops/connecting.html#http-客户

它工作得非常好(例如,我得到了google.com页面)。然后我做了一些更改以发出POST请求:更改POST上的请求方法

conn.setRequestMethod("POST");

并添加以下代码(从这里获得:http://developer.android.com/reference/java/net/HttpURLConnection.html):

      conn.setDoOutput(true);
      conn.setChunkedStreamingMode(0);
      OutputStream out = new BufferedOutputStream(conn.getOutputStream());     
      out.close();

所以现在下载Url的方法看起来像这样:

private String downloadUrl(String myurl) throws IOException {
  InputStream is = null;
  // Only display the first 500 characters of the retrieved
  // web page content.
  int len = 500;

  try {
      URL url = new URL(myurl);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setReadTimeout(10000 /* milliseconds */);
      conn.setConnectTimeout(15000 /* milliseconds */);

      conn.setDoInput(true);

      conn.setRequestMethod("POST");
      conn.setDoOutput(true);
      conn.setChunkedStreamingMode(0);
      OutputStream out = new BufferedOutputStream(conn.getOutputStream());     
      out.close();

      // Starts the query
      conn.connect();
      int response = conn.getResponseCode();
      Log.d(DEBUG_TAG, "The response is: " + response);
      is = conn.getInputStream();

      // Convert the InputStream into a string
      String contentAsString = readIt(is, len);
      return contentAsString;

  // Makes sure that the InputStream is closed after the app is
  // finished using it.
  } finally {
      if (is != null) {
          is.close();
      } 
  }
}

它总是抛出一个例外。你能帮帮我吗,怎么了?

共有2个答案

齐凯康
2023-03-14

我承认了这个问题:问题是服务器不接受所选URL上的POST请求。更改URL(和服务器)会导致请求成功,而不会引发异常。

索嘉石
2023-03-14

这是因为Android不允许您在主UI线程上启动网络连接。你必须启动一个后台线程(使用AsyncTask)并从那里开始。

在这个问题上有更多细节。

 类似资料:
  • 我正在编写一个简单的脚本,涉及CAS、jSpring Security检查、重定向等。我想使用Kenneth Reitz的python请求,因为这是一个很棒的工作!然而,CAS需要通过SSL进行验证,所以我必须首先通过这一步。我不知道Python requests需要什么?这个SSL证书应该驻留在哪里?

  • 我使用的是Restcomm SMSC的最新版本(SMSCGATEWAY-7.3.153)(可在以下站点获得:https://github.com/Restcomm/sMSCGATEWAY/releases/tag/7.3.153)。我使用的是二进制版本,而不是源代码。 我已经启动并运行了它与卡珊德拉通信,卡珊德拉适当地托管在不同的机器上。 我正在附加一个。pcap文件,它显示了我通过Wiresha

  • 发送请求 发送同步请求 Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send(); String clientVersion = web3Client

  • 构建 Web 应用时,把请求转发给另一个 servlet 处理、或在请求中包含另一个 servlet 的输出通常是很有用的。RequestDispatcher 接口提供了一种机制来实现这种功能。 当请求启用异步处理时,AsyncContext 允许用户将这个请求转发到servlet 容器。

  • jd.request(OBJECT) 发起网络请求。 OBJECT参数说明: 参数名 类型 必填 默认值 说明 url String 是 开发者服务器接口地址 data Object/String/ArrayBuffer 否 请求的参数 header Object 否 设置请求的 header,header 中不能设置 Referer。 method String 否 GET (需大写)有效值:

  • HTTP 请求 数据绑定 使用 Context#Bind(i interface{}) 绑定一个请求内容体到 go 的结构体。默认的绑定器支持解析 Content-Type 是 application/json,application/xml 和 application/x-www-form-urlencoded 的数据。 下面是绑定请求数据到 User 结构体的例子 // User User s