今天接入了第三方平台的api,对方平台用的.NET语言,接口文档要求调用者调用时要发送POST请求,请求参数格式为:Content-Type:application/json,接入的时候遇到了两个问题,特此分享出来供大家参考一下。一个问题是请求的参数值中有中文时,会因为编码问题导致服务端接收到的参数解析出来是错误的;还有一个问题,是对方要求传入的时间类型的格式是这样的字符串:"/Date(1570315680000+0800)/",作为一个java后端开发人员,我拿到接口文档时就懵了,没见过啊,好在后来找到了这篇博客https://www.jb51.net/article/120883.htm,这是部分截图:
其实后来想想,也没有这么麻烦,只要将参数拼接成json字符串的格式也是一样的效果:
String body = "{\"AccessToken\": \"1ja4gwh6-5b8c-55d2-9b0d-496e9e34fres\",\"Time\": \"/Date("+new Date().getTime()+"+0800)/\"}";
下面直接上源码,先导入httpclient依赖的jar包:
<!-- httpclient依赖开始 -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<!-- httpclient依赖结束 -->
下面是具体的代码:
package util;
import java.util.Date;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
public class HttpClientUtils {
public static void main(String[] args) throws JSONException {
String url = "http://www.*.com/getPosition.action";
JSONObject jsonParam = new JSONObject();
jsonParam.put("AccessToken", "1ja4gwh6-5b8c-55d2-9b0d-496e9e34fres");
jsonParam.put("Time", String.format("/Date(%s+0800)/", new Date().getTime()));
String body=jsonParam.toString();
//其实这样直接拼接的效果也是一样的
// body = "{\"AccessToken\": \"1ja4gwh6-5b8c-55d2-9b0d-496e9e34fres\",\"Time\": \"/Date("+new Date().getTime()+"+0800)/\"}";
JSONObject jo = postJson(url, body);
if(jo.getBoolean("MY_DEAR_RESULT")){
System.out.println("请求响应成功");
}else{
System.out.println("请求响应失败,原因:"+jo.getString("MY_DEAR_REASON"));
}
}
public static JSONObject postJson(String url, String body) {
JSONObject jo=new JSONObject();
try {
HttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
//设置请求头
post.setHeader("Content-Type", "application/json");
StringEntity se = new StringEntity(body,"utf-8");
//设置请求体,很重要,为了避免请求参数值的中文乱码,需要设置为utf-8格式
se.setContentEncoding("UTF-8");
se.setContentType("application/json");
post.setEntity(se);
//获取返回信息
HttpResponse response = client.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
//自己封装一下结果,也可以不封装,直接返回;注意封装的时候,要避免定义的参数名是唯一的,避免与接口返回的参数一致
if(statusCode==200){//请求成功了
jo = new JSONObject(EntityUtils.toString(entity, "UTF-8"));
jo.put("MY_DEAR_RESULT",true);
}else{
jo.put("MY_DEAR_RESULT",false);
jo.put("MY_DEAR_REASON","响应状态码:"+statusCode);
}
} catch (Exception e) {
try {
jo.put("MY_DEAR_RESULT",false);
jo.put("MY_DEAR_REASON","网络异常:"+e.getMessage());
} catch (JSONException e1) {
}
}
return jo;
}
}