java通过发送参数为json格式的post请求获取api数据
方法1
需要用到的jar包有;
1、fastjson.jar
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class PostDemo {
public void doPost() {
HttpURLConnection httpURLConnection = null;
try {
// 1. 获取访问地址URL
URL url = new URL("http://api.w****u.com");
// 2. 创建HttpURLConnection对象
httpURLConnection = (HttpURLConnection) url.openConnection();
/* 3. 设置请求参数等 */
// 请求方式 默认 GET
httpURLConnection.setRequestMethod("POST");
// 超时时间
httpURLConnection.setConnectTimeout(3000);
// 设置是否输出
httpURLConnection.setDoOutput(true);
// 设置是否读入
httpURLConnection.setDoInput(true);
// 设置是否使用缓存
httpURLConnection.setUseCaches(false);
// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
httpURLConnection.setInstanceFollowRedirects(true);
// 设置请求头,测试此段代码可以省略
//httpURLConnection.addRequestProperty("sysId","sysId");
// 设置使用标准编码格式编码参数的名-值对,但以下方法都适用于json,似乎无效
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
//httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置传入参数的格式:请求参数应该是 json格式。
httpURLConnection.setRequestProperty("Content-Type", "application/json");
// 连接
httpURLConnection.connect();
/* 4. 处理输入输出 */
// 写入参数到请求中
//params是参数,内容是json格式
String params="{\"api_name\":\"stock_basic\",\"token\":\"7d7b****cfa\",\"params\":{\"list_status\":\"L\"},\"fields\":\"\"}";
OutputStream out = httpURLConnection.getOutputStream();
out.write(params.getBytes());
// 简写方式
//httpURLConnection.getOutputStream().write(params.getBytes());
out.flush();
//关闭
out.close();
// 从连接中读取响应信息
String msg = "";
int code = httpURLConnection.getResponseCode();
if (code == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(httpURLConnection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
msg += line + "\n";
}
//关闭
reader.close();
}
// 处理结果
String js=msg;
//msg是api返回的字符串,其中中文是乱码,需要通过fastjson转成json对象后中文能正常输出.关键步骤!!!!
JSONObject jsonObject = JSONObject.parseObject(js);
System.out.println(jsonObject);
} catch (IOException e) {
System.out.println("出错,错误信息:"+e.getLocalizedMessage()+";"+e.getClass());
}finally {
// 5. 断开连接
if (null != httpURLConnection){
try {
httpURLConnection.disconnect();
}catch (Exception e){
System.out.println("httpURLConnection 流关闭异常:"+ e.getLocalizedMessage());
}
}
}
}
}
方法2
需要用到的jar包有;
1、httpclient-4.5.8.jar
2、httpcore-4.4.1.jar
3、commons-logging-1.1.1.jar
4、fastjson.jar
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.entity.StringEntity;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class PostDemo2 {
public void doPost() {
String result="";
String url="http://api.waditu.com";
//创建一个HashMap对象,可以类似json格式,设置键/值
Map<String,Object> map=new HashMap<>();
//添加
map.put("api_name","stock_basic");
map.put("token","7d7b429b2d47d2c02d93fb52ad057a400df4532c4a057bff348b3cfa");
map.put("fields","");
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put("list_status","L");
map.put("params",hashMap);
//创建http客户端
CloseableHttpClient client= HttpClientBuilder.create().build();
//设post请求
HttpPost post = new HttpPost(url);
try {
//创建请求实体传参
StringEntity postingString = new StringEntity(JSONObject.toJSONString(map));
//设置post请求参数
post.setEntity(postingString);
CloseableHttpResponse response= null;
//执行post请求
response = client.execute(post);
//访问成功状态码为200
if(response.getStatusLine().getStatusCode()==200){
//从响应中获取实体内容,通过EntityUtils(工具)转成字符串
result= EntityUtils.toString(response.getEntity());
//响应内容中文会乱码,需要转json对象
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println(jsonObject);
}else {
System.out.println("出错!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
文章只是学习总结,部分内容参考https://blog.csdn.net/weixin_43670802/article/details/102865855
感谢我Moody哥。