JAVA後端調用.NET平臺提供的服務,要求發送POST請求,參數格式爲:Content-Type:application/json

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

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章