HttpURLConnection碰到连续302跳转的问题

用HttpURLConnection联网的代码:

      HttpURLConnection conn = null;
      URL url = new URL("http://10.0.0.172/");
      conn = (HttpURLConnection) url.openConnection();

      conn .setRequestMethod("POST");
      conn .setDoInput(true);
      conn .setDoOutput(true);
      conn.setRequestProperty("X-Online-Host","www.xxxx.com");

      conn.setConnectTimeout(30000); // 30秒超时
      conn.connect();

 

如果返回的页面是一个302跳转,会自动跳转,但是如果跳转过去后还是一个302跳转,就卡在connect()这里了,超时之后一个 connection reset 的 exception. 不论Get还是Post方法,都一样问题。用setFollowRedirects关掉自动重定向,还是connection reset. 查了很长时间,还是弄不出个所以然来,看HttpURLConnection 的实现代码,redirect大于4次才会抛出一个Too many redirects 的异常,这才两个302就挂了...最后换用org.apache.http包里的东西,就没有问题。

 

  DefaultHttpClient httpClient = new DefaultHttpClient();

  HttpHost proxy = new HttpHost("10.0.0.172", 80);
  httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY,proxy);
  HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),20 * 1000);
  HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000);
  HttpGet httpget = new HttpGet(theurl);
  HttpResponse response
= httpClient.execute(httpget);

 

无论是自动跳转还是手动处理跳转都没有问题。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用`HttpURLConnection`实现保持长连接并进行连续对话,您需要使用`URLConnection`的`setRequestProperty()`方法设置`Connection`头字段为`keep-alive`,并在每次请求后使用`getResponseCode()`方法来读取响应码,以保持连接处于活动状态。下面是一个示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { try { // 创建URL对象 URL url = new URL("http://example.com/streaming-api"); // 循环进行对话 while (true) { // 打开连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法为POST connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置Connection头字段为keep-alive connection.setRequestProperty("Connection", "keep-alive"); // 发送请求 OutputStream outputStream = connection.getOutputStream(); outputStream.write(buildRequestData().getBytes()); outputStream.flush(); outputStream.close(); // 获取响应码 int responseCode = connection.getResponseCode(); // 检查响应码 if (responseCode == HttpURLConnection.HTTP_OK) { // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 读取响应数据 String line; while ((line = reader.readLine()) != null) { // 处理每行数据 System.out.println(line); } // 关闭输入流 reader.close(); } else { // 处理请求失败的情况 System.out.println("Request failed. Response code: " + responseCode); } // 断开连接 connection.disconnect(); // 休眠一段时间,模拟对话间隔 Thread.sleep(1000); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private static String buildRequestData() { // 构造请求数据,根据实际情况进行修改 return "{\"message\": \"Hello, server!\"}"; } } ``` 在上面的示例中,我们在循环中使用`HttpURLConnection`发送多个POST请求来实现连续对话。在每个请求中,我们设置了`Connection`头字段为`keep-alive`以保持连接活动。我们还设置了`setDoOutput(true)`来允许将数据写入请求体中。在每个请求之后,我们使用`getResponseCode()`方法来读取响应码以保持连接处于活动状态。最后,我们断开连接并休眠一段时间以模拟对话间隔。 请根据您实际的需求修改`buildRequestData()`方法来构造适当的请求数据。同时,请将`http://example.com/streaming-api`替换为您要请求的实际URL
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值