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");
 

posted on 2022-11-09 12:26  &大飞  阅读(1261)  评论(0编辑  收藏  举报

导航