一:C#调用java服务代码:
调用方法:这里的M205RegistComment对象 是自定义的,就是跟返回的json序列化的对象保持一致就ok,
注意date时间需要转换为string 并且格式需要跟api一致,
http://172.16.5.32/api/website/topic/available/get 就是 java里面的API接口访问地址。
string param1 = JsonConvert.SerializeObject(new { member_no = cardNo, date = dateString });
WebApiInvokeHelper.PostResponse<M205RegistComment>("http://172.16.5.32/api/website/topic/available/get", param1);
静态方法:用的是HttpContent 调用方法
public static T PostResponse<T>(string url, string postData, string contentType = "application/json") where T : class, new()
{
T result = default(T);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
httpContent.Headers.ContentType.CharSet = "utf-8";
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
string json = JsonConvert.DeserializeObject(s).ToString();
result = JsonConvert.DeserializeObject<T>(json);
if (result == null)
{
AppLog.Write(string.Format("API接口名称:{0},序列化失败原因:{1}", url, result.ToString()), LogMessageType.Error);
}
}
else
{
AppLog.Write(string.Format("API接口名称:{0},调用失败原因:{1}", url, response.RequestMessage.ToString()), LogMessageType.Error);
}
}
return result;
}
二:java调用C#的Api接口代码:
1:小在pom里面引用工具,
第一个是序列化工具
第二个 http的工具类 也就是调用远程api的
第三个是加密的工具类
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<!--hutool 工具引入-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>5.3.10</version>
<scope>compile</scope>
</dependency>
2: 调用get方法,在 hutool里面有好多方法,
例如get请求方法 用 HttpUtil类就可以 。这里也可以自定义先对hutool的方法自己封装一下再调用,也可以直接调用。
这里面会可以写post方法,或者其他方法,都可以调用hutool的方法
package com.greentree.h5webapi.utils;
import cn.hutool.http.HttpUtil;
import java.util.Map;
/**
* @Desc: http 请求帮助类
* **
* @Date: created in 16:11 2021/4/1
*/
public class HttpUtils {
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @return {@link String} 请求返回的结果
*/
public static String get(String url, Map<String, Object> paramMap) {
return HttpUtil.get(url, paramMap);
}
}
3:具体的方法调用,这里需要注意 config里面是配置的 调用的C#的API地址url,以及加密需要用到key ,这里做了一个安全验证,简单的签名。
这是一个公用方法,所有的调用第三方的get方法 都可以先走该方法,这里用会员做了一个加密,然后api方法也用相同的key加密校验
然后用户编号 跟sign 添加到map 里面去。
调用hutool的 get方法
@Autowired
private WebsiteConfig config;
private OriginalRequest getHttpResult(String url, Map<String, Object> param, String userId) {
if (param == null) {
return new OriginalRequest( );
}
// userId 加密
if (!StringUtils.IsEmpty(userId)){
String sign = SecureUtils.encryptDES(userId, config.getSignKey( ));
param.put("userId", userId);
param.put("sign", sign);
}
String resStr = HttpUtils.get(config.websiteUrl(url), param);
return JSONObject.parseObject(resStr, OriginalRequest.class);
}
4:这里是具体的用户登录方法调用。
WebsiteApiConstant.CHECK_PAY_PASSWORD 是一个 api的具体控制器方法
map是参数
userid是用户编号
@Override
public Boolean checkPassWord(String userId, String password) {
Map<String, Object> map = new HashMap<>( );
map.put("password", password);
OriginalRequest res = getHttpResult(WebsiteApiConstant.CHECK_PAY_PASSWORD, map, userId);
if (res != null && res.getResult( ) && res.getData( ) != null) {
CheckPayPassword data = JSONObject.parseObject(res.getData( ), CheckPayPassword.class);
if (data != null) {
return data.getIsSuccess( );
}
}
return false;
}