欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:961
  2. 浏览总数:11,479,759
  3. 评论:3873
  4. 分类目录:103 个
  5. 注册用户数:5841
  6. 最后更新:2018年10月17日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

使用HttpClient通过post方式发送json数据

  有时候我们在发送HTTP请求的时候会使用到POST方式,如果是传送普通的表单数据那将很方便,直接将参数到一个Key-value形式的Map中即可。但是如果我们需要传送的参数是Json格式的,会稍微有点麻烦,我们可以使用HttpClient类库提供的功能来实现这个需求。假设我们需要发送的数据是:

{
    "blog": "https://www.iteblog.com", 
    "Author": "iteblog"
}

我们可以通过JSONObject够着Json:

JSONObject jsonObject = new JSONObject();

jsonObject.put("blog", "https://www.iteblog.com");
jsonObject.put("Author", "iteblog");

如果需要使用Post方式来发送这个数据,我们可以如下实现:

private HttpMethodBase createMethod(String url, int timeout) {
        PostMethod method = null;
        try {
            method = new PostMethod(url);
            JSONObject jsonObject = new JSONObject();

            jsonObject.put("blog", "https://www.iteblog.com");
            jsonObject.put("Author", "iteblog");

            String transJson = jsonObject.toString();
            RequestEntity se = new StringRequestEntity(transJson, "application/json", "UTF-8");
            method.setRequestEntity(se);
            //使用系统提供的默认的恢复策略
            method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            //设置超时的时间
            method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, timeout);
        } catch (IllegalArgumentException e) {
            logger.error("非法的URL:{}", url);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return method;
}

  我们通过StringRequestEntity来构造请求实体,在这里,StringRequestEntity将接收三个参数,如下:

public StringRequestEntity(String content, String contentType, String charset) 
  throws UnsupportedEncodingException

  其中参数content就是我们需要传输的数据;contentType是传送数据的格式,因为我们的数据格式是json的,所以contentType必须填写application/json(更多的contentType可以参见《HTTP Content-Type常用一览表》);charset是字符集编码。

  然后我们再通过HttpClient对象的executeMethod方法来执行:

int statusCode = httpClient.executeMethod(getMethod);
//只要在获取源码中,服务器返回的不是200代码,则统一认为抓取源码失败,返回null。
if (statusCode != HttpStatus.SC_OK) {
      logger.error("Method failed: " + getMethod.getStatusLine() + "\tstatusCode: " + statusCode);
      return null;
}

pom.xml文件的关键内容

<dependencies>
        <!--网络爬虫-->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>14.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
        </dependency>
</dependencies>

完整代码下载

点击进入下载

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【使用HttpClient通过post方式发送json数据】(https://www.iteblog.com/archives/1379.html)
喜欢 (48)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!