java 实现通过 post 方式提交json参数操作

由于所爬取的网站需要验证码,通过网页的开发人员工具【F12】及在线http post,get接口测试请求工具(http://coolaf.com/)发现访问时加上请求头header 信息时可以跳过验证码校验。

而且该网站只接受post请求,对提交的参数也只接受json格式,否则请求失败。

现将通过 post 方式提交json参数的方法记录如下:

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * <p>@PostJsonParamsTest.java</p>
 * @version 1.0
 * @author zxk
 * @Date 2018-3-3
 */
public class PostJsonParamsTest {

  // 超时时间
  private static final int RUN_TIME =10000;

  // 爬取初始页数
  private String page;

  public static void main(String[] args) throws Exception {
    PostJsonParamsTest crawl = new PostJsonParamsTest();

    // 请求的url地址
    String url ="http://www.gzcredit.gov.cn/Service/CreditService.asmx/searchOrgWithPage";
    // 设置起始访问页码
    crawl.setPage("1");
    String isStop = "";

    // 设置请求
    HttpRequestBase request = null;
    request = new HttpPost(url);

    try {
      // 设置config
      RequestConfig requestConfig = RequestConfig.custom()
            .setSocketTimeout(RUN_TIME)
            .setConnectTimeout(RUN_TIME)
            .setConnectionRequestTimeout(RUN_TIME)
            .build();
      request.setConfig(requestConfig);

      // json 格式的 post 参数
      String postParams ="{\"condition\":{\"qymc\":\"%%%%\",\"cydw\":\"\"},\"pageNo\":"+crawl.getPage()+",\"pageSize\":100,count:2709846}";
      System.out.println(postParams);
      HttpEntity httpEntity = new StringEntity(postParams);
      ((HttpPost) request).setEntity(httpEntity);

      // 添加请求头,可以绕过验证码
      request.addHeader("Accept","application/json, text/javascript, */*");
      request.addHeader("Accept-Encoding","gzip, deflate");
      request.addHeader("Accept-Language", "zh-CN,zh;q=0.8");
      request.addHeader("Connection", "keep-alive");
      request.addHeader("Host", "www.gzcredit.gov.cn");
      request.addHeader("Content-Type", "application/json; charset=UTF-8");

      URIBuilder builder = new URIBuilder(url);
      URI uri = builder.build();
      uri = new URI(URLDecoder.decode(uri.toString(), "UTF-8"));
      request.setURI(uri);

      while(!isStop.equals("停止")||isStop.equals("重跑")){
        isStop = crawl.crawlList(request);
        if(isStop.equals("爬取")){
          crawl.setPage(String.valueOf(Integer.parseInt(crawl.getPage())+1));
        }

        // if("2713".equals(crawl.getPage())) break;
        if("2".equals(crawl.getPage())){
          break;
        }
      }
    } catch (NumberFormatException e) {
      e.printStackTrace();
      throw new NumberFormatException("数字格式错误");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
      throw new UnsupportedEncodingException("不支持的编码集");
    }
  }
  /**
   * 爬取搜索列表
   * @param page
   * @return
   */
  private String crawlList(HttpRequestBase request){
    int statusCode = 0;

    // 下面两种方式都可以用来创建客户端连接,相当于打开了一个浏览器
    CloseableHttpClient httpClient = HttpClients.createDefault();
    // HttpClient httpClient = HttpClientBuilder.create().build();

    HttpEntity httpEntity = null;
    HttpResponse response = null;
    try {
      try {
        response = httpClient.execute(request);
      } catch (Exception e){
        e.printStackTrace();
        EntityUtils.consumeQuietly(httpEntity);
        return "重跑";
      } 

      //打印状态
      statusCode =response.getStatusLine().getStatusCode();
      if(statusCode!=200){
        EntityUtils.consumeQuietly(httpEntity);
        return "重跑";
      }
      //实体
      httpEntity = response.getEntity();
      String searchListStr = EntityUtils.toString(httpEntity,"GBK").replaceAll("\\\\米", "米");
      String allData = (String) JSONObject.parseObject(searchListStr).get("d");
      // 字符串值中间含双引号的替换处理
      String s = allData.replaceAll("\\{\"","{'")
          .replaceAll("\":\"", "':'")
          .replaceAll("\",\"", "','")
          .replaceAll("\":", "':")
          .replaceAll(",\"", ",'")
          .replaceAll("\"\\}", "'}")
          .replaceAll("\"", "")
          .replaceAll("'", "\"")
          .replaceAll("<br />", "")
          .replaceAll("\t", "")
          .replaceAll("\\\\", "?");
      JSONObject jsonData = JSONObject.parseObject(s);
      JSONArray jsonContent = jsonData.getJSONArray("orgList");

      searchListStr = null;
      allData = null;
      s = null;

      if (jsonContent==null || jsonContent.size()<1) {
        return "重跑";
      }
      System.out.println(jsonContent.toJSONString());
      return "爬取";
    } catch (Exception e) {
      e.printStackTrace();
      return "重跑";
    } finally{
      EntityUtils.consumeQuietly(httpEntity);
    }
  }

  private String getPage() {
    return page;
  }

  private void setPage(String page) {
    this.page = page;
  }

}

补充知识:JAVA利用HttpClient发送post请求,将请求数据放到body里

我就废话不多说了,大家还是直接看代码吧~

  /**
   * post请求 ,请求数据放到body里
   * @param url  请求地址
   * @param bodyData 参数
   * @author wangyj
   * @date 2019年4月20日
   */
  public static String doPostBodyData(String url, String bodyData) throws Exception{
    String result = "";
    CloseableHttpClient httpClient = null;
    CloseableHttpResponse response = null;
    try {
      HttpPost httpPost = getHttpPost(url, null); // 请求地址
      httpPost.setEntity(new StringEntity(bodyData, Encoding));
      httpClient = getHttpClient();
      // 得到返回的response
      response = httpClient.execute(httpPost);
      HttpEntity entity = response.getEntity();
      result = getResult(entity, Encoding);
    } catch (Exception e) {
      throw e;
    } finally {
      // 关闭httpClient
      if (null != httpClient) {
        httpClient.close();
      }
      // 关闭response
      if (null != response) {
        EntityUtils.consume(response.getEntity()); // 会自动释放连接
        response.close();
      }
    }
    return result;
  }

以上这篇java 实现通过 post 方式提交json参数操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈Java代码的 微信长链转短链接口使用 post 请求封装Json(实例)

    废话不多说,直接上代码 String longUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + MpUtil.APPID + "&redirect_uri=" + MpUtil.HOMEPAGE + "/nweixinLoginPc.fo%3Frandomcode=" + randomcode + "&response_type=co

  • Java后台基于POST获取JSON格式数据

    1.直接使用request.getParamater()的方法获取(这种取参方式对于POST和GET的提交方式均适用): 2.通过请求体的IO流获取参数(这种方式只能用于POST,因为GET方式没有请求体): String s =""; InputStream in = null; BufferedInputStream bin = null; try{ in = request.getInputStream(); bin = new BufferedInputStream(in);

  • java 通过发送json,post请求,返回json数据的方法

    实例如下所示: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import org.json.JSONArray; impo

  • java模拟post请求发送json的例子

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class HttpUtilTest { Log log = new Log(this.getClass());//初始化

  • java 实现通过 post 方式提交json参数操作

    由于所爬取的网站需要验证码,通过网页的开发人员工具[F12]及在线http post,get接口测试请求工具(http://coolaf.com/)发现访问时加上请求头header 信息时可以跳过验证码校验. 而且该网站只接受post请求,对提交的参数也只接受json格式,否则请求失败. 现将通过 post 方式提交json参数的方法记录如下: import java.io.UnsupportedEncodingException; import java.net.URI; import jav

  • java通过模拟post方式提交表单实现图片上传功能实例

    本文实例讲述了java通过模拟post方式提交表单实现图片上传功能.分享给大家供大家参考,具体如下: 模拟表单html如下: <form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1"> <label> <input type="tex

  • python3 http提交json参数并获取返回值的方法

    如下所示: import json import http.client connection = http.client.HTTPSConnection('spd.aiopos.cn') headers = {'Content-type': 'application/json'} values = { 'acct_pan':'6226011****83678', 'acct_name':'张三', 'cert_type':'01', 'cert_id':'37293019****95', 'p

  • java 利用HttpClient PostMethod提交json数据操作

    故事前要 今天,在做公司的一个项目,需要和第三方公司进行对接,需要将我们采集到的数据发送给第三方公司,按照对方提供的文档,传递好参数后,httpclient.execute(method)请求后,得到的状态码 ,一直是502,犹豫第一次使用HttpClient post json数据,一直怀疑是自己的代码问题,最后不知在哪个技术论坛看到 ,有人问url请求中有空格怎么办,突然发现对方提供的pdf文档中 竟然包含空格,而我天真的无视掉了 以为是文档的问题. 算了-- 不多BB了-. PostMet

  • PHP基于curl模拟post提交json数据示例

    本文实例讲述了PHP基于curl模拟post提交json数据.分享给大家供大家参考,具体如下: 这里php模拟post提交json数据操作的关键是在头部设置Content-Type <?php header("Content-type:application/json;charset=utf-8"); $url="http://192.168.10.234:8080/uc/login/loginid"; $param=array( //注册字段 "n

  • java中form以post、get方式提交数据中文乱码问题总结

      一:form在前台以post方式提交数据: 浏览器将数据(假设为"中国")发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个码表提交数据.数据到达服务器后,数据(98 99)要封装到request中,在servlet中调用Request的getParameter方法返回的是字符串("中国"),方法内部拿到数字后要转成字符,一定要查码表,由于request的设计者是外国人,所以默认查的是他

  • 关于处理GET方式提交的含有特殊字符的参数

    曾经有一位朋友遇到这样一个问题,一产品名称为A&T Plastic,在产品列表中就产生了这样的一个联接<a href="product.asp?name=A&T Plastic">A&T Plastic</a>,在服务器端接收此参数的时候怎么也无法接收到准确的产品名. 当时就问我,如何解决,也许是当时忙吧,随口告诉他用HTMLENCODE方法,对方试告诉并没有能解决这个问题.我当时没有再给予回答,偶尔想起实在是对不起,我讲错了.今日闲暇就

  • Spring boot中自定义Json参数解析器的方法

    一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0.0.1:8080/test 提交类型为application/json * 测试参数{"sid":1,"stuName":"里斯"} * @param str */ @RequestMapping(value = "/test",method = Re

  • jquery.form.js实现将form提交转为ajax方式提交的方法

    本文实例讲述了jquery.form.js实现将form提交转为ajax方式提交的方法.分享给大家供大家参考.具体分析如下: 这个框架集合form提交.验证.上传的功能. 这个框架必须和jquery完整版结合,否则使用min则无效. 原理:利用js进行对form进行组装成ajax的url和data,原理还是用ajax来提交,其实这完全可以自己写,但是有这个框架可能会更简单. 一.最简单例子: 第一步:引用js <!--这里的min是自己用js压缩工具对完整版进行的压缩 并不是真正的min,所以好

  • 在Action中以Struts2的方式输出JSON数据的实例

    下面是整个Action的完整代码: package cn.ysh.studio.struts2.json.demo.action; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.Servlet

随机推荐