## **業務保存類接口格式說明**
#### 接口協議主要采用http(s),因此下面從請求頭,請求體,響應體方面做出說明
* **請求頭格式**
|請求頭標識|必填|內容|備注|
| --- | --- | --- |--|
|Authorization|Y|Bearer [token-data](接口訪問授權.md) |遵循w3c標準|
|Accept|Y| application/json;charset=utf-8|遵循w3c標準|
|Content-Type|Y| application/json;charset=utf-8|遵循w3c標準|
|X-ThirdSysId|Y|FW-OA|泛微OA系統標識 |
* **請求體參數**
|參數名|類型|必填|說明|示例|
|--|--|--|--|--|
|formId|string|N|URI已包含| |
|operationNo|string|N|URI已包含| |
|billData|JString|Y| 本參數是數組,每個數組內對象的封包結構參考:[封包結構參考](數據字典介紹.md)||
* **響應體參數**
|參數名|類型|必含|說明|示例|
|--|--|--|--|--|
|operationResult|jobject|Y| | |
|  complextMessage|string|Y| | |
|    successMessages|jarray|Y|成功類消息| |
|    errorMessages|jarray|Y|錯誤類消息| |
|    warnMessages|jarray|Y|警告類消息| |
|    hasMessage|bool|Y|是否有消息| |
|  isSuccess|bool|Y|是否操作成功| |
|  srvData|any|Y|接口返回數據| 本屬性是實際每個操作返回的數據,對保存操作而言,它是一個數組,其它操作返回的可能是字典,每個接口返回都可能不太一樣|
|    [0]|jobject|Y|數組對象| |
|      id|string|Y|保存后內碼| |
|      number|string|Y|保存后編碼| |
|      name|string|Y|保存后名稱| |
## **場景示例描述**
假定現有一第三方系統(如:XXOA),需要將其系統里的【品牌】資料同步到易到家系統。現在我們在編寫同步代碼之前需要按以下步驟拿到幾個關鍵信息:
1、通過[數據字典](數據字典介紹.md)功能,查找到業務對象標識,這里得到本對象的formId為:ydj_brand,同樣從數據字典中得到發布的數據結構:
{
????"id":?"",
????"fname":?"菲尼斯",
????"fdescription":?"由xx系統同步生成"
}
2、通過訪問授權中的步驟從待集成系統的管理員那里拿到令牌,例如令牌為(這里的令牌注意要換成目前你要集成環境下的用戶令牌,不要直接拿這里的示例使用,有可能已過期):
**eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImF1dGhvciI6ImxpbnVzIn0.eyJpc3MiOiJmdy5hYmNkIiwic3ViIjoiMjcwODQzNjI5MzczODg2NDY2IiwiaWF0IjoxNTU3MjE2NTY1LCJleHAiOjQwNzA4ODAwMDAsInByZWZlcnJlZF91c2VybmFtZSI6MTg1NjYyMzExNTksImNvbXBhbnlzIjpbeyJjb21wYW55SWQiOiIyNzA4NDM2MjE4MzI1Mjc4NzMiLCJjb21wYW55TmFtZSI6Iue7j-mUgOWVhjEwIiwiY29tcGFueU51bWJlciI6IjI3MDg0MzYyMTgzMjUyNzg3MyIsImFjY291bnRJZCI6IiIsImFjY291bnRTdGF0dXMiOiIifV0sImNvbXBhbnkiOiIyNzA4NDM2MjE4MzI1Mjc4NzMiLCJwcm9kdWN0IjpudWxsLCJyZWZ1c2VyaWQiOm51bGwsInJlZnNjZW5laWQiOm51bGwsImNhbGxlckNvbnRleHQiOiIiLCJ1c2VySWQiOiIyNzA4NDM2MjkzNzM4ODY0NjYiLCJyZW1vdGVVc2VySWQiOm51bGwsInVzZXJUeXBlIjowfQ.YsPtsKom5IqYVlrrY5XtIm0VBZLcbNRiPmgfF8i151skaJDA63YD0AzcZjEpCS8zRmXyZ2KKdVPhp4dDJ_lfStmsgM4ZEszA1jBbvKIzuQYaBNdM2g-uLh6IFBeQo-cE2VLtA2P7Ca1yTOTWkGfC3afeFiU-I9fAEMDPRFz6-Do**
應用標識為:**fw-oa**
**有了上述信息后,只需要構建http請求了,按照上面所說的請求頭、請求體的形式進行發送請求。各語言請求示例如下:**
> ### ajax調用示例
```
code區域待補充
```
> ### nodejs調用示例
```
code區域待補充
```
>### C#調用示例
```
code區域待補充
```
>### Java調用示例
```
package com.ydj.example.sync.ydjsync;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import javax.activation.MimetypesFileTypeMap;
import com.google.gson.Gson;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
????????HashMap header = new HashMap();
//這里的令牌注意要換成目前你要集成環境下的用戶令牌,不要直接拿這里的示例使用,有可能已過期
????????header.put("Authorization","Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImF1dGhvciI6ImxpbnVzIn0.eyJpc3MiOiJmdy5hYmNkIiwic3ViIjoiMjcwODQzNjI5MzczODg2NDY2IiwiaWF0IjoxNTU5MDI1NzMxLCJleHAiOjQwNzA4ODAwMDAsInByZWZlcnJlZF91c2VybmFtZSI6MTg1NjYyMzExNTksImNvbXBhbnlzIjpbeyJjb21wYW55SWQiOiIyNzA4NDM2MjE4MzI1Mjc4NzMiLCJjb21wYW55TmFtZSI6Iue7j-mUgOWVhjEwIiwiY29tcGFueU51bWJlciI6IjI3MDg0MzYyMTgzMjUyNzg3MyIsImFjY291bnRJZCI6IjM4MTgzNzgzMzAzMzM1NTI2NiIsImFjY291bnRTdGF0dXMiOiJmcGF5YWNjb3VudF9zdGF0dXMwMSJ9XSwiY29tcGFueSI6IjI3MDg0MzYyMTgzMjUyNzg3MyIsInByb2R1Y3QiOm51bGwsInJlZnVzZXJpZCI6bnVsbCwicmVmc2NlbmVpZCI6bnVsbCwiY2FsbGVyQ29udGV4dCI6IiIsInVzZXJJZCI6IjI3MDg0MzYyOTM3Mzg4NjQ2NiIsInJlbW90ZVVzZXJJZCI6bnVsbCwidXNlclR5cGUiOjAsImFwcEtleSI6IkZXLU9BIn0.5ngc0moZRGtFjRDVTXl1pFaHshP3NVR6dNXbOMRUS2z9IF-viFFYQsP2ToJNpv84i8hx39fAEkvJy3MMHLmxV2RlWsFL915O0t1zZveM9z97LWQudqq7Rvimt6LYnor8P8nK79yXXCUAWleofu95MrVBTwPQ9cKR8lVRiFz3mIc");
????????header.put("Accept", "application/json;charset=utf-8");
????????header.put("Content-Type", "application/json;charset=utf-8");
Gson gson = new Gson();
????????HashMap reqParam = new HashMap<>();
????????HashMap billData = new HashMap<>();
????????billData.put("fnumber", "test100");
????????billData.put("fname", "test100");
????????billData.put("fdescription", "系統集成自動生成");
????????List> lstBills = new ArrayList<>();
????????lstBills.add(billData);
????????reqParam.put("billData", gson.toJson(lstBills));
????????String result = doPost("http://192.168.0.23:8100/bill/ydj\_dept?operationno=save", header,?gson.toJson(reqParam));
????????HashMap jsonResult = gson.fromJson(result, HashMap.class);
????}
public static String doPost(String url, Map header, String jsonParams) {
BufferedReader in = null;
try {
// 定義HttpClient
HttpClient client = new DefaultHttpClient();
// 實例化HTTP方法
HttpPost request = new HttpPost();
request.setURI(new URI(url));
for (Iterator iter = header.keySet().iterator(); iter.hasNext();) {
String headerName = (String) iter.next();
String value = String.valueOf(header.get(headerName));
request.addHeader(headerName, value);
}
//由于請求輸入的參數只認json類型,因此這里的設置一定要注意,不要用錯,如果誤用:UrlEncodedFormEntity,將會報400錯誤。
StringEntity entity = new StringEntity(jsonParams);
entity.setContentType("application/json");
entity.setContentEncoding("utf-8");
request.setEntity(entity);
HttpResponse response = client.execute(request);
int code = response.getStatusLine().getStatusCode();
if (code == 200) { // 請求成功
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
return sb.toString();
} else { //
System.out.println("狀態碼:" + code);
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
```
>### PHP調用示例
```
code區域待補充
```
>### Python調用示例
```
code區域待補充
```
- 業務開發詳解系列
- 基礎名稱概念解釋
- 開發調試環境搭建
- 基礎資料開發詳解
- 單據開發詳解
- 動態表單開發詳解
- 業務報表開發詳解
- 單據轉換流程開發詳解
- 套打功能設計詳解
- K3Cloud系統集成配置詳解
- 系統集成開發詳解系列
- 基礎介紹
- 接口設計原則
- 接口訪問授權
- 數據字典介紹
- 接口調用示例
- 業務應用開發Q&A
- 項目整體介紹
- 如何鎖定或解鎖某個字段?
- 如何鎖定或解鎖某個菜單按鈕?
- 如何顯示或隱藏某個字段?
- 如何顯示或隱藏某個菜單按鈕?
- 如何實現(金額=單價*數量)這樣表達式計算?
- 如何使一個視圖元素(按鈕,標簽等)具備發起一個服務請求?
- 如何向操作中傳遞固定參數?
- 如何向操作中傳遞可變或動態參數?
- 如何讓一個操作具備確認交互能力?
- 如何讓一個操作具備復雜交互界面能力?
- 如何設置一個字段為必錄?
- 選擇基礎資料,如何攜帶出其它字段信息
- 如何進行字段校驗(手機號,郵箱,身份證)?
- 如何作一個列表式報表?
- 表頭字段唯一驗證