java发送Http请求(获取响应cookie、重定向)

1、正常的发送Http请求,获取返回值(json格式)

/**
*引入的相关包
*import org.apache.http.HttpEntity;
*import org.apache.http.client.methods.CloseableHttpResponse;
*import org.apache.http.client.methods.HttpPost;
*import org.apache.http.entity.StringEntity;
*import org.apache.http.impl.client.CloseableHttpClient;
*import org.apache.http.impl.client.HttpClients;
*import org.apache.http.message.BasicHeader;
*import org.apache.http.protocol.HTTP;
*import org.apache.http.util.EntityUtils;
*import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
*import net.sf.json.JSONArray;
*import net.sf.json.JSONObject;
*/
String body = "";
//创建httpclient对象
CloseableHttpClient client = HttpClients.createDefault();
//创建post方式请求对象
HttpPost httpPost = new HttpPost(url);
//装填参数
// jsonObject 是需要封装的参数
StringEntity s = new StringEntity(jsonObject.toString(), "utf-8");
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));
//设置参数到请求对象中
httpPost.setEntity(s);       
//设置header信息
//指定报文头【Content-type】、【User-Agent】
//httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.setHeader("Content-type", "application/json");
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
body = EntityUtils.toString(entity, encoding);
}
EntityUtils.consume(entity);
//释放链接
response.close();
return body;

请求头中参数设置

  1. Accept:告诉服务器能够发送哪些媒体类型,Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准, 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据)
  2. Accept-Charset:告诉服务器能够发送哪些字符集(utf-8)
  3. Accept-Encoding:告诉服务器能够发送哪些编码方式(Accept-Encoding: gzip, deflate )
  4. Accept-Language:告诉服务器能够发送哪些语言(Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 )
  5. Cookie:客户端用它向服务器传送cookie数据值
  6. User-Agent:将发起请求的应用程序的名称告知服务器;User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答
User-Agent: Mozilla/5.0 (平台) 引擎版本 浏览器版本号  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
  1. Content-type:服务端根据请求头中的Content-Type字段来获取消息主体的编码方式,进而进行解析数据。
    Content-type常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

Content-type以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

上传文件使用:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

HTTP Content-Type 对照表:
地址:http://tool.oschina.net/commons/

2、登录后获取返回cookie,同时解决登录后的重定向问题

// 获取cookie
String host = "http://localhost:8080";
String url = "/login?username=zhangsan&password=123456";
CookieStore store = new BasicCookieStore();
//创建httpclient对象
CloseableHttpClient client = HttpClients.custom().setDefaultCookieStore(store).build();
//创建post方式请求对象
HttpPost httpPost = new HttpPost(host + url);
String result = "";
//设置header信息
//指定报文头【Content-type】、【User-Agent】
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
 //执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
    result = EntityUtils.toString(entity, "utf-8");
    int code = response.getStatusLine().getStatusCode();
    String newUrl="";
    if (code == 302) {
       // 跳转的目标地址是在 HTTP-HEAD 中的
       Header header = response.getFirstHeader("location");
                newUrl = header.getValue(); // 这就是跳转后的地址,再向这个地址发出新申请,以便得到跳转后的信息是啥。
       httpPost = new HttpPost(host + newUrl);
       response = client.execute(httpPost);
       entity  = response.getEntity();
        result = EntityUtils.toString(entity, "utf-8");
            }
        }
        EntityUtils.consume(entity);
        //释放链接
        response.close();
一、创建http连接是,创建CookieStore并放入连接中,以便获取返回的cookie。
二、重定向返回的状态码是302,postman可以重定向到新的地址,但是发送http请求不会自动的重定向。所以,需要再次发送一次http请求。这就是为什么,postman请求没有问题,但是程序执行就302。(一般系统对接都是专门的接口,不会出现这种重定向的问题,其次现在大多数都是"Content-type":“application/json”都是json交互)
三、因为post方法数据提交格式是“application/x-www-form-urlencoded”,所以参数是拼接到url后面的。

** HTTP请求的状态码:**
地址:https://blog.csdn.net/lyh1023812/article/details/119810249
我遇到一个比较坑的对接需求,上传数据也是拼接到url后面。如果有中文会报错,解决:

//jsondata:包含中文的参数转码
String encode = URLEncoder.encode(jsondata, "utf-8");
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,可以使用 `java.net.HttpURLConnection` 类来发送 HTTP 请求并设置 cookie。下面是一个简单示例: ```java import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; public class RedirectWithCookie { public static void main(String[] args) throws Exception { String urlString = "http://example.com"; URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置 cookie String cookie = "key=value"; conn.setRequestProperty("Cookie", cookie); // 允许重定向 conn.setInstanceFollowRedirects(true); conn.connect(); // 获取重定向后的 URL 和响应头部信息 int responseCode = conn.getResponseCode(); String location = conn.getHeaderField("Location"); Map<String, List<String>> headerFields = conn.getHeaderFields(); // 输出结果 System.out.println("Response code: " + responseCode); System.out.println("Location: " + location); System.out.println("Header fields:"); for (Map.Entry<String, List<String>> entry : headerFields.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` 在上面的示例中,我们首先创建了一个 `URL` 对象,然后使用 `HttpURLConnection` 打开连接。接着,我们设置 cookie,允许重定向,并连接到远程服务器。 如果重定向成功,我们可以使用 `getResponseCode()` 方法获取响应代码,使用 `getHeaderField("Location")` 方法获取重定向后的 URL,以及使用 `getHeaderFields()` 方法获取响应头部信息。最后,我们将这些信息输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值