# 与Ajax的不同

在支付、结算等信息敏感的场景,防止请求抓包是非常重要的安全保障措施。然而Web端基于XHR的HTTP请求往往不能很好地实现SSL安全证书策略,Native端却可以轻而易举实现这一需求。因此Http模块在App环境中将支持开启SSL证书策略,调用Galleon的Http请求方法,业务开发者并不需要关注如何实现两种请求的兼容策略。同时由于Galleon的Http方法是由原生客户端发起的,因此它将不会有请求跨域的问题。

另外,为支持后续App端实现离线化架构,网络请求需完全交给Native端来实现。Kreator会对Http模块进行兼容实现,保证业务开发者无需关注容器差异。

http模块支持回调函数风格的调用,也可以通过Promise使用,因此如果您的项目使用了Babel,可以直接通过Async函数处理异步请求的调用,无需进一步的封装处理。

# 调用方式

# Api域:

const http  = kreator.http:

http模块仅提供一个方法:

http(params:HttpRequestOptions):Promise<HttpResponseOptions>

入参格式如下:

HttpRequestOptions = {
    url: string // 请求接口的url
    
    params?: object  // params字段为JSONString形式传递给后端接口的参数,它将放置在body的param字段中
    
    data?: object | null // data为FormData格式的请求参数体,也就是说,data中的字段与param是同层级的
    
    method?: string // 请求形式,默认为get,支持get/post/jsonp。注意使用jsonp时,将会强制关闭原生请求
    
    header?: object // 请求头,99%的情况下都不要传入这个参数,大概率会导致后端CORS跨域配置失效(由于Option预检被触发且校验不通过导致)
    
    timeout?: number // 请求超时时间

    withCredentials?: boolean // 是否传输Cookie,并允许进行CORS跨域验证。默认为true。
    
    customRes?: boolean // SDK不采用任何方式验证返回数据的正确性,一概将返回值抛出
    
    useNativeHTTP?: boolean // 是否开启App端的GaHttp请求,默认为不开启(原因后述)
    
    nativeSSL?: boolean // 是否开启原生请求SSL证书加密,默认为不开启。注意:只有请求域名的HTTPS协议的接口才会生效。由于客户端自身Bug,它仅在App v5.0.8以上版本可用
    
    isFormParams?: boolean // 入参是否为Form
    
    jsonpCallback?: string | number // jsonp请求回调函数的前缀,默认为Kreator_
    
    success?(res: HttpResponseOptions): void // 请求成功时执行Resolve

    fail?(err: HttpResponseOptions): void // 请求失败,执行catch
    
    complete?(res: HttpResponseOptions): void // 请求完成回调,即是说失败与成功都会执行
    
    beforeSend?(req: HttpRequestOptions): void // 请求发起前的回调函数
}

HttpResponseOptions = {
    code: string,
    data: object | null,
    msg: string
}

以下为一个参考栗子🌰 :

http({
    url: 'https://testdetail.dmall.com/waredetail/main',
    params: {
        storeId: '108706',
        skuId: '101253671',
        moduleCodes: 'shipment,spec,tips,store,recommend,description',
        longitude: 116.373205,
        latitude: 39.816585,
    },
    data: {
        source: '2',
        d_track_data: true,
        tempid: 'C94791451BB0000273C61DA019E01E76',
    },
    nativeSSL: false, 
    useNativeHTTP: true, 
    method: 'post', 
    timeout: 3000, // 请求超时时间
    beforeSend(req) { // 请求发起前的回调函数
        console.log('即将请求...');
    },
    success(res) { // 请求成功回调
        alert(JSON.stringify(res));
        console.log(res);
    },
    fail(err){ // 请求失败回调
        alert(err)
        console.log(err)
    },
    complate(res){ // 请求完成回调,即是说失败与成功都会执行
        alert(res)
        
    }
}).then((res) => { // 请求成功时执行Resolve
    console.log(res);
}).catch((err) => { // 请求失败,执行catch
    console.log(err);
});