N.1 介绍
1)相关网站介 (1)在线的jison格式验证 JSON在线校验格式化工具(Be JSON) (2)kettle和NoSQLBooster for MongoDB 可以用的上。 (3)mysql也有json提取函数 select JSON_EXTRACT('{"id":"124515"}', '$.id') 提取json的value ,但要注意 必修是 mysql5.7版本以上 ,不然会报错FUNCTION JSON_EXTRACT does not exist 2)get和post请求 但没有说固定使用哪一种 ,根据接口文档定义的 (1)带参数的GET请求的方式 方式一:直接将参数拼接到url后面 如:www.baidu.xxx.com?name=java&sex=man 方式二:使用URI的方法设置参数 setParameter("key", "value") (2)带参数的post请求的方式 方式一:使用URI的方法设置参数 setParameter("key", "value"), 但post里的Content-type请求有4中写法,即4种参数设置写法,但本质都是代码里面设置参数,算一种方式的一种。而get里的Content-type设置是没有影响效果的。 3)post请求的4种类型格式 参考链接 https://www.cnblogs.com/yrxns/p/11051685.html (1)Header("Content-type", "application/json") //市场用的比较多的一种,这里介绍这种。 如书写格式:{"input1":"xxx","input2":"ooo","remember":false} (2)Header("Content-type", " multipart/form-data") // 默认的 如书写格式:input1=xxx&input2=ooo&remember=false (3)Header("Content-type", "boundary= application/x-www-form-urlencoded") (4)Header("Content-type", "text/xml") 4)拓展:在postman里面row格式包括:text、json、xml、html |
N.2 Post请求(Json传参或不传参)
(1)还要注意,市场目前很多请求返回的数据条数是有限制的,有的是公司是get和post每次请求返回的数据最大就1mb以下。有的公司是每次请求“每页最多可以取出100条”数据,然后遍历每一页,直到把数据给取完为止。 (2)一般来讲 这两个参数是很常见也是必带的情况: { "current": 1, "pageSize": 100 } current是当前页号,pageSize表示当前页的数据大小. |
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> |
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpResponse; import org.apache.http.ParseException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Collection; import java.util.Set; public class javaHttp { public static void main(String[] args) throws IOException { // 调用API读取json数据 JSONObject data = javaHttp.deviceRequest("http://hn216.api.yesapi.cn/?&s=App.Common_University.Search&return_data=0&top_num=10&school_name=师范&app_key=AD7A0B7A69D53F9E35EAB48A6D4E7CAD"); // System.out.println(jsonFormatPrint.responseFormat(data2.toString())); // 注意 idea在打印的时候 会用内容限制 有些内容不会显示 // System.out.println(data1); // 显示结果 {"msg":"成功","code":200,"data":{"history":[{"close_volta .... // 读取json数据,或可以是本地文件 JSONObject dataB = JSON.parseObject( "{\n" + "\"ret\":200,\"data\":{\"err_code\":0,\"err_msg\":\"\",\"schools\":[\n" + "{\"school_name\":\"北京师范大学\",\"school_province\":\"北京\",\"school_level\":\"本科\",\"school_website\":\"http:\\/\\/www.bnu.edu.cn\\/\",\"school_city\":\"北京市\"},\n" + "{\"school_name\":\"首都师范大学\",\"school_province\":\"北京\",\"school_level\":\"本科\",\"school_website\":\"http:\\/\\/www.cnu.edu.cn\\/\",\"school_city\":\"北京市\"}]\n" + "}\n" + "}\n" + ""); /** *json的基本判断 */ System.out.println(data.size()); // 第一层的key有几个。内嵌的层不计数 System.out.println(data.isEmpty()); // 是否为空 System.out.println(data.containsKey("data")); // 第一层的key是否有data System.out.println(data.containsValue(200)); // 第一层的value是否有200 /** *json的集合获取 */ // 获取第一层的key集合 Set<String> data1 = data.keySet(); for (String str : data1) { System.out.print(str + ","); // ret,msg,data,_t,_auth } // 获取第一层的value集合 Collection<Object> data2 = data.values(); for (Object str : data2) { System.out.println(str); } /** * 获取某个key位置的值 */ //获取第一层结果要求返回JSONObject。这样就方便继续获取第二层的数据 Object a = data.getJSONObject("data").get("schools"); //获取第一层结果要求返回JSONObject。且获取第二层的数据要求返回JSONArray。这样就方便取出第三层索引2的数据 Object b = data.getJSONObject("data").getJSONArray("schools").get(2); //获取第一层结果要求返回JSONObject。且获取第二层的数据要求返回JSONArray。且获取第三层的索引2数据要求返回数组对象。这样就可以获取school_name的数据 Object c = data.getJSONObject("data").getJSONArray("schools").getJSONObject(2).get("school_name"); System.out.println(a);// [ { xxx},{xxx} ,{xxx} ] System.out.println(b); // {"school_website":"http://www.kdcnu.com/","school_level":"本科","school_name":"首都师范大学科德学院","school_city":"北京市","school_province":"北京"} System.out.println(c); // 首都师范大学科德学院 /** * 构造自己需要的数据 */ // 提取 (err_code, err_msg, school_name, school_city) 信息 String err_code = data.getJSONObject("data").get("err_code").toString(); //获取JSON数组集合 String err_msg = data.getJSONObject("data").get("err_msg").toString(); //获取JSON数组集合 JSONArray dataArr = data.getJSONObject("data").getJSONArray("schools"); //获取JSON数组集合 for (Object x : dataArr) { JSONObject jsonData = (JSONObject) JSONObject.toJSON(x); // 这里的话 不能直接变成JSONObject,所以要转换一下 System.out.println(err_code + "," + err_msg + "," + jsonData.get("school_name") + "," + jsonData.get("school_city")); //显示结果 = 0,,北京师范大学,北京市 } } /** * 主要使用于带了json参数(不带也行)的get或post请求 */ public static JSONObject deviceRequest(String url) { JSONObject result = null; try { JSONObject json = new JSONObject(); // 3个参数,有参数要求自己可以加,没有参数要求 可以不加 // json.put("macid", "038580248574"); // json.put("from", 1625068801); // 2021-07-01 00:00:01 // json.put("to", 1627660799); // 2021-07-30 23:59:59 // 创建httpclient @SuppressWarnings({"resource"}) HttpClient httpClient = new DefaultHttpClient(); // 创建post 配置post请求参数 HttpPost post = new HttpPost(url); // 如果要用get 这里就创建httpGet() 对象即可 post.setEntity(new StringEntity(json.toJSONString())); post.setHeader("Content-type", "application/json"); //如果你请求的是json这里就设置json 不对应的话 会报错 // 有的业务 token不是放在URL里面的,是放在请求头里面的,配置如下 // post.addHeader("token","eyJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2NTk2MDIyODMsImNlciI6IntcImFiYW5kb25"); // post.setHeader("token", "eyJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2NTk2MDIyODMsImNlciI6IntcImFiYW5kb25"); //set其实不用写也可以 // 执行请求 HttpResponse response = httpClient.execute(post); // 获取请求结果 String data = EntityUtils.toString(response.getEntity()); result = (JSONObject) JSONObject.parse(data); } catch (ParseException | IOException e) { e.printStackTrace(); } return result; } /** * 将json数据写出 */ public static void fileWriter(Object data,String path) throws IOException { FileWriter fileWriter = new FileWriter(path); // 写出文件的时候 要注意记得 flush和close 否则数据会丢失部分 BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(jsonFormatPrint.formatOut(data.toString())); bufferedWriter.flush(); bufferedWriter.close(); } } |
N.3 结果