JAVA后端调用.NET平台提供的服务,要求发送POST请求,参数格式为:Content-Type:application/json

本文分享了在使用Java调用.NET平台API时遇到的问题及解决办法,包括处理中文编码和特殊时间格式的解决方案,提供了具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值