api对接_api对接 shopify - CSDN
精华内容
参与话题
  • 关于业务系统间API对接的那些事

    千次阅读 2019-02-24 22:15:46
    本周先后进行了两个业务系统的对接工作,虽然不是直接负责开发,但也耗费了不少的精力,好在进度符合预期,本篇论文就结合业务系统对接这个点分享一下粗陋的经验,也当做记录了,同时为了下周在团队的分享提前预热。...

    概述

    本周先后进行了两个业务系统的对接工作,虽然不是直接负责开发,但也耗费了不少的精力,好在进度符合预期,本篇论文就结合业务系统对接这个点分享一下粗陋的经验,也当做记录了,同时为了下周在团队的分享提前预热。

    有关对接的错误假设

    1.对接方了解要对接的事
    有几次我联系要对接的技术人员要沟通对接的细节时,对方都是一脸懵逼的反应,你是谁啊,联系我做什么,这是不归我管,好吧我去问问。

    2.负责对接的技术人员拥有实现对接所需要的技术能力
    有一次我跟一个对接方沟通一个系统监控信息获取的问题,需要获取底层的硬件信息,所以需要使用STMP协议,结果对接方找了个技术人员没有听过STMP,没办法也协调不动,就把STMP相关的测试和开发资料发了过去,人家也是挺给力,现学现用,几经周折终于通了,但进度已经远远落后于预期了。

    3.对接方十分愿意完成对接这个工作
    这个也遇到过不少次,尤其是行业内的,对接方总是对于我们的呼声带搭不理,最后不得已协调了他们客户的上级单位才开始了对接工作,结果十分简单的对接拖了很长很长时间,弄得我方用户很是无奈和崩溃。

    上面的问题都不是技术层面的,在对接这个事情上,技术真的往往不是主要的。

    对接要点

    1. 在对接进入到实质性阶段后,双方沟通交流一定要带着技术人员,并组建联系群,否则就是双方牛没少吹,但对接工作却迟迟没进展
    2. 尽早对接和磋商,有疑问一定要提出来
    3. 提前做对接工作,大多数人都喜欢做选择题,所以在对接前要做好调研,最好弄几套对接方案,对方一看有了现成方案,只要不是太离谱就会采纳,这样后面的开发就主动的多
    4. 最有一定要有对齐和接口文档发布的过程,以邮件的形式留底,并要确认
    5. 不要太指望文档 ,就算有了文档在开发过程中最好也要经常确认
    6. 尽早建立测试条件,只是Stub也比没有好一万倍
    7. 接口的设计一定要谨慎,对方系统的事情尽量少知道,能采用Restful就不采用rpc或中间件,共享数据库什么的能不用就不用
    8. 如果不得不采用WebService等强耦合技术,那就将对接部分分离出来

    接口设计的一些不错资料

    上面大部分资料转自极客时间的《左耳听风专栏》

    展开全文
  • 第三方API对接常见问题

    万次阅读 2018-11-13 10:33:00
    JAVA项目中通常会需要通过对接第三方API来扩展项目业务,如支付,风控,语音识别,图像处理等。但看似简单的发送/接收请求却包含了Http请求,数据加密/解密,签名加签/验签,数据处理等内容。这次通过对接某公司API...

    JAVA项目中通常会需要通过对接第三方API来扩展项目业务,如支付,风控,语音识别,图像处理等。但看似简单的发送/接收请求却包含了Http请求,数据加密/解密,签名加签/验签,数据处理等内容。这次通过对接某公司API,也踩了不少坑,跟大家分享一下。

     

    1.文档/demo版本过旧,被对接方服务端代码已经更改,但文档未更新

    一般来说,文档的易读程度和更新速度能说明被对接公司技术部门的水平。我见过比较好的公司例如 阿里云,连连支付,FaceId,白骑士等等。但是也有比较坑的,这一点大家就要注意了。

    文档里一般有更新时间,最近更新时间距离当前日期越近越好。

    如果真的遇到比较老的文档和demo,那就多和对方技术人员沟通,搞不定的地方尽快去问对方技术,不要钻牛角尖。

    2.加密方式问题

    为了防止被抓包,一般都会使用加密算法来对请求参数进行加密,常见加密方式有,RSA,MD5,ITRUS,DES等等,如果不是有特殊要求,选择优先级 MD5>DES>RAS>ITRUS.  说白了就是怎么简单怎么来。

    注意点:

    MD5加密方式有好几种类型,一定要弄清楚要对接的接口是MD5 32位 还是 MD5 16位

     JAVA开发的话 RAS加密 密钥记得进行 PKCS8转码

    ITRUS加密注意替换JDK中的两个jar包:
              用无限制扩展包替换 jdk 安装目录下的 local_policy.jar 和 US_export_policy.jar

    例如:jdk 安装目录下: C:\Program Files\Java\ jdk1.8.0_31 替 换 文 件 所 在 的 目 录 : C:\Program Files\Java\ jdk1.8.0_31 \jre\lib\security

    jdk8 替换包参考:《jdk 替换包.zip》中《jce_policy-8.zip》

    jdk7 替换包参考:《jdk 替换包.zip》中《UnlimitedJCEPolicyJDK7.zip》

    jdk6 替换包参考:《jdk 替换包.zip》中《jce_policy-6.zip》

    jdk8 替换包下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-downlo ad-2133166.html

    jdk7 替换包下载地址: http://www.oracle.com/technetwork/java/embedded/embedded-se/downloa ds/jce-7-download-432124.html

    jdk6 替换包下载地址: http://www.oracle.com/technetwork/java/embedded/embedded-se/downloa ds/jce-6-download-429243.html

    3.加签验签问题

    对参数进行加密签名,通常都需要过滤掉空参数以及字段signType和sign。 一般的demo中都会带的有过滤方法,也可以自己写,难度不大

    private static Map<String, String> paraFilter(Map<String, String> oriMap) {
            Map<String, String> result = new HashMap();
            if (oriMap != null && oriMap.size() > 0) {
                Iterator var2 = oriMap.entrySet().iterator();
    
                while(var2.hasNext()) {
                    Entry<String, String> iterator = (Entry)var2.next();
                    String value = (String)iterator.getValue();
                    if (!StringUtils.isBlank(value) && !((String)iterator.getKey()).equalsIgnoreCase("sign") && !((String)iterator.getKey()).equalsIgnoreCase("sign_type")) {
                        result.put(iterator.getKey(), value);
                    }
                }
    
                return result;
            } else {
                return result;
            }
        }

    加密前,注意检查参数名是否完全和文档中相同,一个空格都不能多,也不能少。否则对方验签失败,这种细节的错误有时候也很难找。

    注意点:我喜欢用JSONObject对装载参数,但是这里有一个问题,fastJson工具在对jsonObject进行格式转换处理时,可能会打乱原json对象里的字段顺序,导致自己/对方签名校验败。这里有三个解决方案 

    1、解析时增加  Feature.OrderedField  参数固定顺序

     Map<String, String> params = JSON.parseObject(jsonStr, new TypeReference<Map<String, String>>(){}, Feature.OrderedField);

    2、初始化json对象为有序对象:

    JSONObject retObj = new JSONObject(true);

    这样生成的json对象就与放入数据时一致。

    3、使用Gson解析

    JsonObject returnData = new JsonParser().parse(replyString).getAsJsonObject();

    4.HttpClient发送请求问题

    一般来说第三方API主要使用POST/GET两种方法。按照demo或者文档中的示例能很快确定对方接口的数据格式以及请求方式,不要自己瞎猜乱写,这样效率太低。有的公司会直接提供SDK或者jar包供我们参考,这是极好的。

    注意点:

    不要轻易将sdk或者jar包引入自己项目,认真检查是否埋有恶意代码。 也可以直接将需要用的代码复制粘贴出来,新建工具类使用。ctrl+c/ctrl+v美滋滋

    发送务必检查是否对请求前对参数进行urlencode编码,否则会数据被转义,参数校验失败。

    5.回调问题

    注意点:

    1.在需要回调(异步通知API结果)的时候,我方会使用亚瑟(雾)。。。会使用一个异步请求接口来接受异步通知,即使对方说明了是post或者get请求方法通知,也不要在@RequestMapping()注解中标明请求方式,这样能给对方没有什么限制,不会容易发生415(bad request)错误码的情况。

    2.尽量不要使实力类在方法入参里直接接参数,参数出错了直接就是415(bad request),不容易debug,用request.getParameter()的方式写一个工具类。遍历处请求参数,set到对象里,这是我们项目的类,自己写也不难,百度你懂的

     public static NoticeResp parseNotice(HttpServletRequest request) {
           NoticeResp resp = new NoticeResp();
            Field[] fields = NoticeResp.class.getDeclaredFields();
            for (Field field : fields) {
                ReflectionUtils.setFieldValue(resp, field.getName(), request.getParameter(field.getName()));
            }
            return resp;
        }

    如:

     @RequestMapping("notify")
     @ResponseBody
     public Object notify(HttpServletRequest request, HttpServletResponse response){
    
    }

     

    下班了,也基本说完了,有什么疑问可以留言,欢迎多交流,指正

    展开全文
  • Api程序接口对接

    2019-07-30 07:26:55
    先看一下参数表和参数示例 首先是参数,我们而已发现,json数据成层级方式显示,所以我们先以层级关系为主 定义类(从图中可以发现一共存在6个类):定义类的时候我们需要把子级类也定义出来(标黄部分)。...

    先看一下参数表和参数示例

     

    首先是参数,我们而已发现,json数据成层级方式显示,所以我们先以层级关系为主 定义类(从图中可以发现一共存在6个类):定义类的时候我们需要把子级类也定义出来(标黄部分)。这里定义的类只是请求参数的类

     

     public class L_Lable
        {
            //Lable
            public L_Data Data { get; set; }
            public string Requestld { get; set; }
            public string RequestTime { get; set; }
            public string Version { get; set; }
        }
    
    
    
    public class L_Data
        {
            
            public string OrderID { get; set; }
            public L_ParcelInformation ParcelInformation { get; set; }
            public L_RecipientAddress RecipientAddress { get; set; }
            public string ChannelName { get; set; }
            public string Token { get; set; }
            public string ServiceTypeCode { get; set; }
            public string WarehouseCode { get; set; }
            public string LabelMarkText { get; set; }
            public L_RedundancyField RedundancyField { get; set; }
    
        }
    
    
    public class L_ParcelInformation
        {
            public string Weight { get; set; }
            public string WeightUnit { get; set; }
            public string Length { get; set; }
            public string Width { get; set; }
            public string Height { get; set; }
            public string SizeUnit { get; set; }
            public string ExistDangerousGoods { get; set; }
            public L_ProductInformations ProductInformations { get; set; }
        }
    
    
     public class L_RecipientAddress
        {
            //L_RecipientAddress
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Company { get; set; }
            public string StreetAddress { get; set; }
            public string StreetAddress2 { get; set; }
            public string StreetAddress3 { get; set; }
            public string City { get; set; }
            public string State { get; set; }
            public string ZIPCode { get; set; }
            public string Country { get; set; }
            public string PhoneNumber { get; set; }
            public string PhoneExtension { get; set; }
            public string Email { get; set; }
            public string IsResidential { get; set; }
        }
    
    
     public class L_RedundancyField
        {
            public string SignatureOption { get; set; }
        }
    
    
     public class L_ProductInformations
        {
            public string Description { get; set; }
            public string Quantity { get; set; }
            public string Weights { get; set; }
            public string WeightUnits { get; set; }
            public string Currency { get; set; }
            public string Value { get; set; }
            public string Sku { get; set; }
            public string Remark { get; set; }
            public string ProductUrl { get; set; }
            public string HSCode { get; set; }
        }
    

     

     类定义完成之后定义一个api控制器:(由于我的数据是从数据库中得到的,所以会有 GetLable(); GetParcelInformation(); GetProductInformations(); GetRecipientAddress(); GetRedundancyField(); GetData(); 方法去查询数据查询的方法自行定义

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Tally_test.Model;
    using Newtonsoft.Json;
    using System.Data;
    using System.Text;
    using System.Net;
    using System.IO;
    
    namespace Tally_test.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private IVLableListService _VLableList { get; set; }
            public ValuesController(IVLableListService VLableList)
            {
                _VLableList = VLableList;
            }
    
    
            // GET api/values
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                return new string[] { "value1", "value2" };
            }
    
            // GET api/values/5
            [HttpGet("{id}")]
            public ActionResult<string> Get(int id)
            {
                return "value";
            }
    
            // POST api/values
            [HttpPost]
            public void Post([FromBody] string value)
            {
            }
    
            // PUT api/values/5
            [HttpPut("{id}")]
            public void Put(int id, [FromBody] string value)
            {
            }
    
            // DELETE api/values/5
            [HttpDelete("{id}")]
            public void Delete(int id)
            {
            }
    
    
    
            //查询标签数据
            public async Task<L_Lable> GetLable()
            {
                try
                {
                    var x = _VLableList.GetLable();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            public async Task<L_ParcelInformation> GetParcelInformation()
            {
                try
                {
                    var x = _VLableList.GetParcelInformation();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            public async Task<L_ProductInformations> GetProductInformations()
            {
                try
                {
                    var x = _VLableList.GetProductInformations();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            public async Task<L_RecipientAddress> GetRecipientAddress()
            {
                try
                {
                    var x = _VLableList.GetRecipientAddress();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            public async Task<L_RedundancyField> GetRedundancyField()
            {
                try
                {
                    var x = _VLableList.GetRedundancyField();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            public async Task<L_Data> GetData()
            {
                try
                {
                    var x = _VLableList.GetData();
                    return await x;
                }
                catch (Exception)
                {
                    throw;
                }
            }
           
    

     控制器的主要内容我另起一标签(标黄部分为给子级类赋值)注意赋值前后顺序

    [HttpGet("GetLables")]
            public string GetLables()
            {
                string result = "";           //接收从数据库中查询的数据
                var a = GetLable();
                var b = GetParcelInformation();
                var c = GetProductInformations();
                var d = GetRecipientAddress();
                var e = GetRedundancyField();
                var f = GetData();
                //实例化类并进行赋值
                L_ProductInformations ProductInformations = new L_ProductInformations();
                {
                    ProductInformations.Description = c.Result.Description;
                    ProductInformations.Quantity = c.Result.Quantity;
                    ProductInformations.Weights = c.Result.Weights;
                    ProductInformations.WeightUnits = c.Result.WeightUnits;
                    ProductInformations.Currency = c.Result.Currency;
                    ProductInformations.Value = c.Result.Value;
                    ProductInformations.Sku = c.Result.Sku;
                    ProductInformations.Remark = c.Result.Remark;
                    ProductInformations.ProductUrl = c.Result.ProductUrl;
                    ProductInformations.HSCode = c.Result.HSCode;
                }
                L_RecipientAddress RecipientAddress = new L_RecipientAddress();
                {
                    RecipientAddress.FirstName = d.Result.FirstName;
                    RecipientAddress.LastName = d.Result.LastName;
                    RecipientAddress.Company = d.Result.Company;
                    RecipientAddress.StreetAddress = d.Result.StreetAddress;
                    RecipientAddress.StreetAddress2 = d.Result.StreetAddress2;
                    RecipientAddress.StreetAddress3 = d.Result.StreetAddress3;
                    RecipientAddress.City = d.Result.City;
                    RecipientAddress.State = d.Result.State;
                    RecipientAddress.ZIPCode = d.Result.ZIPCode;
                    RecipientAddress.Country = d.Result.Country;
                    RecipientAddress.PhoneNumber = d.Result.PhoneNumber;
                    RecipientAddress.PhoneExtension = d.Result.PhoneExtension;
                    RecipientAddress.Email = d.Result.Email;
                    RecipientAddress.IsResidential = d.Result.IsResidential;
                }
                L_RedundancyField RedundancyField = new L_RedundancyField();
                {
                    RedundancyField.SignatureOption = e.Result.SignatureOption;
                }
                L_ParcelInformation ParcelInformation = new L_ParcelInformation();
                {
                    ParcelInformation.Weight = b.Result.Weight;
                    ParcelInformation.WeightUnit = b.Result.WeightUnit;
                    ParcelInformation.Length = b.Result.Length;
                    ParcelInformation.Width = b.Result.Width;
                    ParcelInformation.Height = b.Result.Height;
                    ParcelInformation.SizeUnit = b.Result.SizeUnit;
                    ParcelInformation.ExistDangerousGoods = b.Result.ExistDangerousGoods;
                    ParcelInformation.ProductInformations = ProductInformations;
                }
                L_Data datas = new L_Data();
                {
                    datas.OrderID = f.Result.OrderID;
                    datas.ChannelName = f.Result.ChannelName;
                    datas.Token = f.Result.Token;
                    datas.ServiceTypeCode = f.Result.ServiceTypeCode;
                    datas.WarehouseCode = f.Result.WarehouseCode;
                    datas.LabelMarkText = f.Result.LabelMarkText;
                    datas.OrderID = f.Result.OrderID;
                    datas.ParcelInformation = ParcelInformation;
                    datas.RecipientAddress = RecipientAddress;
                    datas.RedundancyField = RedundancyField;
     
                }
                V_LableList LableList = new V_LableList();
                {
                    LableList.Requestld = a.Result.Requestld;
                    LableList.RequestTime = a.Result.RequestTime;
                    LableList.Version = a.Result.Version;
                    LableList.Data = datas;
                }            //类实例化并赋值之后进行  json序列化   (LableList是父类,所以我们最后只要实例化父类就可以了)
                string Datajson = JsonConvert.SerializeObject(LableList);
                //HttpWebRepuest接收
                string URL = "https://.../Api/LabelPrintService/PrintLabel";//你需要调用的接口路径
                Encoding dataEncode = Encoding.UTF8;//编码格式
                result = OpenReadWithHttps(URL, Datajson, dataEncode);
                return result;
            }
     
           //方法为了方便我就写在了控制器里,尽量放到类里面
            public string OpenReadWithHttps(string URL, string paramData, Encoding dataEncode)
            {
                string responseContent = string.Empty;
                try
                {
                    byte[] byteArray = dataEncode.GetBytes(paramData); //转化
                    HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(URL));
                    webReq.Method = "POST";
                    webReq.ContentType = "application/json";
                    webReq.ContentLength = byteArray.Length;
                    //webReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes()));
                    using (Stream reqStream = webReq.GetRequestStream())
                    {
                        reqStream.Write(byteArray, 0, byteArray.Length);//写入参数
                    }
                    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
                    HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
                    using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default))
                    {     /*这里面写你需要进行的操作*/
                             /*
                               responseContent = sr.ReadToEnd().ToString();
                               string a = GetJsonValue(responseContent);
                               //主要进行byte[]类型转换的
                                L_Data data = JsonConvert.DeserializeObject<L_Data>(a);
                                             System.IO.File.WriteAllBytes(@"D:\61290983244643354835.jpg", data.LabelImage);
                             */
            }
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
        return responseContent;
    }
                    public static string GetJsonValue(string strJson)
                   {
                        string strResult;
                       JObject jo = JObject.Parse(strJson);
                       string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();
                       if (values == null)
                       {
                         strResult = "";
                       }
                      else
                      { 
                         strResult = values[0];
                     }
                    return strResult;
                 }
        }
    }
    

      

     现在我们来看一下文档中的返回参数和效果

     

     

     再来看一下我们的运行效果

     

     

    这个接口的主要作用是打印标签,上面数据中的“LableImage”属性的值是byte[]类型,需要我们自行处理为图片类型就好了

     

     

    以上仅为个人操作所得,有误之处,敬请之出,谢谢。

    转载于:https://www.cnblogs.com/A-R-E-S/p/11010740.html

    展开全文
  • 平台api对接

    千次阅读 2019-02-14 20:11:05
    在工作日常中,跨平台api对接是再正常不过的事情了,例如,需要调用api,这个api:免费api ,这是个免费的获取天气信息Get Api。 为了调用这个api,我们需要使用Apache的网络通信java包:org.apache....

    在工作日常中,跨平台api对接是再正常不过的事情了,例如,需要调用api,这个api:免费api ,这是个免费的获取天气信息Get Api。
    为了调用这个api,我们需要使用Apache的网络通信java包:org.apache.http.client.fluent,通常我们建立一个网络请求的话,我们需要做如下事情:

    • 指定请求协议,http 或者https
    • 指定host
    • 指定path
    • 指定代理
    • 指定超时规定
    • 指定参数
    • 指定方法的类型,get/post/delete/put等等

    但是为了简化我们的开发,我们一般会使用默认的,上面只是为了说明基本的请求需要做什么!

    1. 创建一个客户端模拟对象

        /**
           * 模拟请求客户端
           */
          private static final HttpClient client = HttpClients.createDefault();
      
    2. 为了避免网络请求资源过多,我们需要使用执行器,就像多线程一样

         private static final Executor executor = Executor.newInstance(client);
      

      官方文档链接是这么说的官方文档链接是这么说的

      An Executor for fluent requests.
      A PoolingHttpClientConnectionManager with maximum 100 connections per route and a total maximum of 200 connections is used internally.

      大概意思就是一个带有最大200的网络链接的限制的执行者。

    好了,基本的辅助类,我们引入了,那么我们需要开始分析请求了,请求的全部地址为:

    https://www.apiopen.top/addStatistics?appKey=00d91e8e0cca2b76f515926a36db68f5&type=点击统计&typeId=1&count=2
    

    分析结果为:

    属性
    协议 https
    dns域名(可以说是地址了) www.apiopen.top
    path addStatistics
    请求类型 get
    请求参数1 appKey=00d91e8e0cca2b76f515926a36db68f5
    请求参数2 type=点击统计
    请求参数3 typeId=1
    请求参数4 count=2

    url = 协议+dns:https://www.apiopen.top/addStatistics

    Get Api的调用
    1. 因为是Get方法,所以我们需要建立一个Get的基本请求:
          Request request = Request.Get(url);
      
    2. 因为要传递参数,同时避免参数值url中不合法,我们需要使用一个辅助类来转码:
        List<BasicNameValuePair> params = getParams();
         String paramByString = URLEncodedUtils.format(params, "UTF-8");
      
    3. 使用执行器来发送请求,获取结果
      代码如下:
      	   //执行网络请求
                  Response response = executor.execute(request);
                  HttpResponse returnResponse = response.returnResponse();
                  String respJson = EntityUtils.toString(returnResponse.getEntity());
      //            判断返回结果的http status值,可以根据自己的需求来写
                  int statusCode = returnResponse.getStatusLine().getStatusCode();
                  //定义合理的状态值
                  if (statusCode < HttpStatus.SC_OK || statusCode > HttpStatus.SC_MULTIPLE_CHOICES) {
                      throw new RuntimeException("调用api结果返回状态码不对!值为:" + statusCode);
                  }
                  System.out.println("------------调用api返回结果为:" + respJson);
      
    Post Api的调用

    然而在post的Api中,可能会有些许不同(但是上面的模拟客户端和创建执行者,解析url的步骤是一样的),因为在post中,参数不是拼接在url后面用“?”相加起来的,我们需要把参数用另外一种方式来放在Request中,基于如下接口信息

    /**
         * 基于post接口 http://httpbin.org/post
         * request参数:
         * {
         * "username": "vip",
         * "password": "secret"
         * }
         * 返回结果:
         * {
         * "args": {},
         * "data": "{\"username\":\"vip\",\"password\":\"secret\"}",
         * "files": {},
         * "form": {},
         * "headers": {
         * "Accept": "application/json",
         * "Connection": "close",
         * "Content-Length": "38",
         * "Content-Type": "application/json",
         * "Encoding": "UTF-8",
         * "Host": "httpbin.org"
         * },
         * "json": {
         * "password": "secret",
         * "username": "vip"
         * },
         * "origin": "222.73.202.154",
         * "url": "http://httpbin.org/post"
         * }
         */
    
    1. 建立post的基本请求

       String url = "http://httpbin.org/post";
          Request postReq = Request.Post(url);
          PostParam postParam = new PostParam("vip", "secret");
          //设置bodyString
          postReq.bodyString(JacksonUtils.bean2JsonNotNull(postParam), 		ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8));
          return postReq;
      

      设置bodyString

       postReq.bodyString(JacksonUtils.bean2JsonNotNull(postParam), 		ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8));
      

      bodyString的参数根据需求有不同的设值

      post类型 第一个值 第二个值
      application/x-www-form-urlencoded username=vip&password=secret ContentType.APPLICATION_FORM_URLENCODED.withCharset(Charsets.UTF_8)
      application/json {“username”:“vip”,“password”:“secret”} ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8)
    2. 执行上面的第三步
      当post类型为application/json时运行结果如下:

    ------------调用api返回结果为:{
      "args": {}, 
      "data": "{\"username\":\"vip\",\"password\":\"secret\"}", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept-Encoding": "gzip,deflate", 
        "Connection": "close", 
        "Content-Length": "38", 
        "Content-Type": "application/json; charset=UTF-8", 
        "Host": "httpbin.org", 
        "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_101)"
      }, 
      "json": {
        "password": "secret", 
        "username": "vip"
      }, 
      "origin": "222.73.202.154", 
      "url": "http://httpbin.org/post"
    }
    

    当post类型是 application/x-www-form-urlencoded,运行结果为:

    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "password": "secret", 
        "username": "vip"
      }, 
      "headers": {
        "Accept-Encoding": "gzip,deflate", 
        "Connection": "close", 
        "Content-Length": "28", 
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 
        "Host": "httpbin.org", 
        "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_101)"
      }, 
      "json": null, 
      "origin": "222.73.202.154", 
      "url": "http://httpbin.org/post"
    }
    

    最后代码:
    https://github.com/GitHubsteven/building-block/blob/master/net-connection/src/main/java/basic/ApiCallProcess.java

    展开全文
  • 关于API技术对接

    万次阅读 2017-10-26 16:10:06
    API的技术是见证当前网络时代的发展,什么是api,我们要如何运用这项技术,都能在文章中体现
  • API对接是怎么处理的API对接是怎么处理的API对接是怎么处理的API对接是怎么处理的
  • 【c#】Fedex官方API对接过程

    千次阅读 2020-03-15 21:13:22
    获取账户及文档 官网地址:https://www.fedex.com/en-us/home.html 先注册账号(邮箱必须是本人的,需要接受一封邮件,里面会有Key的密码) 到注册的第二步输入账号信息时因为没有信用卡信息,所以跳过。... ...
  • 同是接口,SDK和API哪个最适合你?

    千次阅读 2018-11-09 09:25:26
    比如我们常用的支付宝,接入支付宝 ...因为,不论是销售还是产品等相关人员总会问:SDK和API到底是什么鬼?今天我们就来搞明白它! API 和SDK 到底是什么 API 和SDK是软件行业的两个缩写词。 API (Application Pro...
  • php 对接第三方api接口 笔记

    千次阅读 2018-05-31 14:16:02
    随笔记: 1.先上git上看看有没有sdk。 2.guzzlehttp, 获取数据的话 返回的response 需要 getBody(),然后再json_decode(),才能获取到真正返回的data数据。 3.注意第三方是否有sdk或者沙盒。...
  • 对接接口流程

    千次阅读 2018-06-20 14:37:08
    API //删除课堂房间 @url('/live/room/delete')//路径 @get getDelete(){}//get获取 写方法 getDelete(item) { this.$confirm('删除课程将不能恢复', '删除课程', { confirmButtonText: '确认', ...
  • Amazon各个Api对接地址

    千次阅读 2019-07-16 10:35:46
    亚马逊平台对接地址 由于最近几年都在做甲骨文的netsuite的相关的开发,尤其对跨境电商的开发对接 整理了一份关于amazon的对接相关地址,具体的api接口调整地址以amazon官方的开发者为准,以下仅供参考 主要API...
  • 除此之外,钉钉还开放了API接口。让我们程序员可以非常方便借助钉钉已有的功能,补充企业管理的短板。刚好最近准备开发企业管理软件,我们一起来看一下钉钉有什么API。 一、总体格局钉钉开放给我们的接口有三种类型...
  • 对接第三方接口--使用post请求发送json数据
  • 其他加油站、快递、物流、O2O物业等行业都可以参考这个对接 电子发票: 以京东商城Web端、App端开票演示: 1、调用 “获取accessToken” API接口 https://(这是接口根地址)api2.easyapi.com/(访问令牌)token ...
  • 小程序对接 自写接口

    千次阅读 2017-06-05 15:21:15
    微信小程序 可以对接外部接口 微信提供的方法为:wx.request() 下文为例子: 其中 data 为变量声明 onLoad为方法 具体关于小程序wx.request()方法的其他属性 具体查看小程序 api 注释:代码为小编测试
  • 请问要怎样做个接口供对方调用,是api接口,返回数据格式是json,https请求协议。通过这个接口目的是实现公司网站数据库里的一些数据能够展示在对方平台。我已经和对方平台商量好了,他们把接口开发文档给我了,只要...
  • API简单实现方式(小白教程)

    万次阅读 2018-10-15 19:20:30
    API是啥?自行百度,说真的,规范化的东西许多都看不懂 本人理解的通俗讲:API你可以看成人 你可以和他说话 可以交流 因为每个人不一样,所以API的功能也不尽相同。   举个例子: 天气预报的API:...
  • ... ... 支付接口方是要用企业支付宝作为... 固态收款码和个人收款码怎么才可以做到api对接H5支付形式直接跳转APP付款 做成回调自动上分和api代付的功能 有可以帮忙做到的私聊
  • 交易所钱包对接BTC

    千次阅读 2018-10-10 16:08:48
    上一篇介绍了虚拟币交易平台钱包开发的技术概要,下面我们就开始针对BTC虚拟币的钱包对接进行详细介绍; BTC钱包对接流程 1. 部署BTC钱包节点 2. 分析BTC钱包的API 3. 通过JSON-RPC访问BTC钱包API 4. 部署...
  • API与EDI的区别?

    千次阅读 2018-02-24 17:23:59
    从下图可以看出,有时EDI和...EDI消息类型和特定的传输协议是EDI的重要组成部分,而且EDI消息类型几乎覆盖了供应链领域所有业务,使得其对于增长的对接需求更加友好。 通俗的说就是:API实际上就是一种程序接口,就...
1 2 3 4 5 ... 20
收藏数 47,768
精华内容 19,107
关键字:

api对接