今天接入了第三方平臺的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;
}
}