外围系统调用SAP的WebAPI接口
时间:2022-12-21 19:30:00
提示:文章完成后,目录可以自动生成,如何生成可以参考右边的帮助文档
文章目录
- 前言
- 一、WebAPI 和 WebService有什么区别?
- 二、使用步骤
-
- 1.C#调用SAP的WebAPI接口
- 2.Python调用SAP的WebAPI接口
- 3.Java调用SAP的WebAPI接口
- 总结
前言
提示:此处可添加本文要记录的一般内容:
公司要换新的SAP,之前调用SAP所有通过WebService现在新的方式SAP需要换成WebAPI接口
提示:以下是本文的文本内容,以下案例可供参考
一、WebAPI 和 WebService有什么区别?
WebAPI :
- 无状态、开源、部署IIS在应用程序上
- 基于HTTP协议,数据格式为纯文本,Response可以被Web API的MediaTypeFormatter常用于任何格式的转换Json格式
- 基于HTTP构建轻量级框架。非常适合移动客户端服务
- api类似于cs根据开发人员定义架构、协议和端口。 客户端需要同时开发API服务器端程序
WebService :
- 有状态,不开源,只能部署在IIS上
- 基于Soap只支持协议HTTP协议,数据格式为XML,
- 类似于bs架构,只需要开发服务器端,不需要开发客户端,客户端只需要遵循soap协议,可调用
所有的WebService都是WebAPI,但所有的WebAPI并不是WebService。Web API客户端系统(调用者)和服务系统(提供者)相互独立,调用者可以轻松使用不同的语言(Java,Python,Ruby等)进行API的调用。Web Service几乎总是依赖于两个系统之间的交互XML-RPC接口相互通信,不同客户端下的浏览器对XML分析方法不一致,需要重复编写许多代码
。Web Service更适合为端到端场景提供服务,Web API更适合为应用场景提供服务。可以在网上查看。
二、使用步骤
1.C#调用SAP的WebAPI接口
Get提交代码如下(示例):
string result = string.Empty; var client = new HttpClient(); var strPostUrl = "http://***.**.*.***:8000/sap/bc/rest/z_pda_cbzx_srv?sap-client=300&sap-language=ZH&bukrs=1040"; using (HttpResponseMessage responseMessage = client.Get(strPostUrl)) {
responseMessage.EnsureStatusIsSuccessful(); result = responseMessage.Content.ReadAsString(); } Response.Write(result);
Post提交代码如下(示例):
string result = string.Empty; var client = new HttpClient(); var credentials = username ":" password; var base64Credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials)); client.DefaultHeaders.Add("Authorization", "Basic " + base64Credentials); var strPostUrl = "http://***.**.*.***:8000/sap/bc/rest/z_conftab_srv?sap-client=300&sap-language=ZH"; var postData = new {
action_id = "U", stage = "PLATING", work_step = "PL04-RPXXXXX", seg_attr = "BP" }; System.Web.Script.Serialization.JavaScriptSerializer jss = new JavaScriptSerializer(); HttpContent content = HttpContent.Create(Encoding.UTF8.GetBytes("["+jss.Serialize(postData)+"]"), "application/json"); using (HttpResponseMessage responseMessage = client.Post(strPostUrl, content)) {
responseMessage.EnsureStatusIsSuccessful(); result = responseMessage.Content.ReadAsString(); } Response.Write(result);
2.Python调用SAP的WebAPI接口
Get提交代码如下(示例):
url='http://***.**.*.***:8000/sap/bc/rest/z_pda_cbzx_srv?sap-client=300&sap-language=ZH&bukrs=1040'#存储API调用的URL
r=requests.get(url) #获得URL对象
print("Status code:",r.status_code) #判断请求是否成功(状态码200时表示请求成功)
if r.status_code == 200:
response_dict = r.json() # API返回json格式的信息(将响应存储到变量中)\
print(response_dict)
else:
print("调用 web-api 异常")
POST提交代码如下(示例):
credentials = username + ":" + password
auth = str(base64.b64encode(credentials.encode('utf-8')), 'utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0', "Content-Type": "application/json", 'Authorization': f'Basic {auth}'}
url_json = 'http://***.**.*.***:8000/sap/bc/rest/z_conftab_srv?sap-client=300&sap-language=ZH'
data_json = json.dumps({
'action_id':'U','stage':'PLATING','work_step':'PL04-RPXXXXX','seg_attr':'BP'}) # dumps:将python对象解码为json数据
print("["+data_json+"]")
r_json = requests.post(url_json, "["+data_json+"]", headers=headers)
print("Status code:",r_json.status_code)
print(r_json)
print(r_json.text)
print(r_json.content)
3.Java调用SAP的WebAPI接口
Get提交代码如下(示例):
CloseableHttpClient client = HttpClients.createDefault();
URIBuilder uriBuilder = new URIBuilder("http://***.**.*.***:8000/sap/bc/rest/z_pda_cbzx_srv?sap-client=300&sap-language=ZH&bukrs=1040");
//创建httpGet远程连接实例,这里传入目标的网络地址
HttpGet httpGet = new HttpGet(uriBuilder.build());
// 设置请求头信息,鉴权(没有可忽略)
//httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
// 设置配置请求参数(没有可忽略)
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
.setConnectionRequestTimeout(35000)// 请求超时时间
.setSocketTimeout(60000)// 数据读取超时时间
.build();
// 为httpGet实例设置配置
httpGet.setConfig(requestConfig);
//执行请求
CloseableHttpResponse response = client.execute(httpGet);
//获取Response状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode);
//获取响应实体, 响应内容
HttpEntity entity = response.getEntity();
//通过EntityUtils中的toString方法将结果转换为字符串
String str = EntityUtils.toString(entity);
System.out.println(str);
response.close();
client.close();
Post提交代码如下(示例):
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
// 创建httpPost远程连接实例
HttpPost post = new HttpPost("http://***.**.*.***:8000/sap/bc/rest/z_conftab_srv?sap-client=300&sap-language=ZH");
String credentials = userName + ":" + password;
String encoding = DatatypeConverter.printBase64Binary(credentials.getBytes("utf-8")); //username password 自行修改 中间":"不可少
post.setHeader("Authorization", "Basic " + encoding);
String result = "";
try (CloseableHttpClient closeableHttpClient = httpClientBuilder.build()) {
String jsonPrarms = "{\"action_id\":\"U\",\"stage\":\"PLATING\",\"work_step\":\"PL04-RPXXXXX\",\"seg_attr\":\"BP\"}";
System.out.println("["+jsonPrarms.toString()+"]");
HttpEntity entityParam = new StringEntity("["+jsonPrarms.toString()+"]", "UTF-8");
post.setEntity(entityParam);
post.setHeader("Content-type", "application/json");
HttpResponse resp = closeableHttpClient.execute(post);
StatusLine statusLine = resp.getStatusLine(); //获取请求对象中的响应行对象
int responseCode = statusLine.getStatusCode();
if (responseCode == 200) {
//获取响应信息
HttpEntity entity = resp.getEntity();
InputStream input = entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(input,"utf-8"));
String str1 = br.readLine();
System.out.println("服务器的响应是:" + str1);
br.close();
input.close();
} else {
System.out.println("响应失败");
}
} catch (IOException e) {
e.printStackTrace();
}
总结
记录点点滴滴