BBASMNetworkUtilProtocol.h 5.88 KB
//
//  BBASMNetworkUtilProtocol.h
//  BBAMNP
//
//  Created by baidu on 2019/3/31.
//  Copyright © 2019 Baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <Pyramid/Pyramid.h>
#import "BBASMCommonRequestInfo.h"

#define BBASMC_RequestDataType @"dataType"

NS_ASSUME_NONNULL_BEGIN

AliasService(BBASMNetworkUtilProtocol, bba_MNPNetworkUtil)

extern NSString *const BBASMCUIDRequestConfuseKey; //CUID请求键名
extern NSString *const BBASMUUIDRequestConfuseKey; //UUID请求键名

typedef NS_ENUM(NSUInteger, MNPNetwork) {
    MNPNetworkRequest       =  1, ///< type is 'request'
    MNPNetworkUploadFile,         ///< type is 'uploadFile'
    MNPNetworkDownloadFile,       ///< type is 'downloadFile'
    MNPNetworkSocket,             ///< type is 'socket: connect'
};

typedef NS_ENUM(NSUInteger, BBASMRefererCarrier) {
    BBASMRefererInNativeRequest,  // including request, download, upload.
    BBASMRefererInSlaveWebView,
    BBASMRefererInVideoRequest,
    BBASMRefererInAudioRequest,
    BBASMRefererInPreviewImage,
    BBASMRefererInCoverImage
};

// 请求完成回调,服务端返回数据为responseJson,其他response信息在request中获取
typedef void(^BBASMRequestComplete)(BBANormalAPIRequest * _Nullable request, id responseJson);

// 请求失败回调,错误信息为error,其他response信息在request中获取
typedef void(^_Nullable BBASMRequestFail)(BBANormalAPIRequest * _Nullable request, NSError *error);

@protocol BBASMNetworkUtilProtocol <NSObject>

@optional

/// https校验
+ (BOOL)checkHTTPSscheme:(NSString *)appId url:(NSString *)url;

/// 百度域名校验
+ (BOOL)checkBaiduHost:(NSString *)appId url:(NSString *)url;

/// request白名单校验
+ (BOOL)isHttpsHostValidWithAppID:(NSString *)appID
                              url:(NSString *)url;

/// 白名单校验
+ (BOOL)isHttpsHostValidWithAppID:(NSString *)appID
                              url:(NSString *)url
                      networkType:(MNPNetwork)networkType;

/// 插件域名白名单校验
+ (BOOL)isPluginDomainValidWithAppID:(NSString *)appID
                            pluginID:(NSString *)pluginID
                                 url:(NSString *)url
                         networkType:(MNPNetwork)networkType;

/// 域名白名单校验,包括包域名和插件域名
+ (BOOL)checkDomainWithAPPID:(NSString *)appId
                      params:(NSDictionary *)params
                 networkType:(MNPNetwork)networkType;

/**
 * @brief 校验域名白名单,包括包域名和插件域名
 *
 * @param appId  xcx id
 * @param pluginId  插件
 * @param url 请求
 * @param networkType 网络类型
 * @return NO 校验不通过
 */
+ (BOOL)checkDomainWithAPPID:(NSString *)appId
                    pluginId:(NSString *)pluginId
                         url:(NSString *)url
                 networkType:(MNPNetwork)networkType;

/**
 * @brief 处理请求响应数据
 * @param apiRequest request请求对象
 * @param dataType 数据类型
 * @param responseType 响应数据类型
 * @param jsonResponse 获取Server返回的json结果
 * @return 格式化后的响应数据
 */
+ (NSString *)parseResponseData:(BBABaseAPIRequest *)apiRequest
                       dataType:(NSString *)dataType
                   responseType:(NSString *)responseType
        intermedateJsonResponse:(NSObject * _Nullable * _Nullable)jsonResponse;

/// js异常写入追踪反馈
+ (void)jsExceptionStr:(NSString *)expStr;

/// 本地缓存request
+ (NSString *)addTask:(id)fileRequest
               forApp:(NSString*)appID;

/**
 * @brief 创建request请求
 *
 * @param appID appID
 * @param handleSystemCookies 是否携带系统cookie
 * @param handleMNPCookies 是否携带小程序cookie框架内的cookie(小程序cookie框架与系统cookie隔离,当前只有swan.request使用小程序cookie框架)
 * @param optionsDict request请求参数字典
 * @param successBlock 成功block
 * @param failBlock 失败block
 * @return apirequest
 */
+ (BBANormalAPIRequest *)requestWithAppID:(NSString *)appID
                      handleSystemCookies:(BOOL)handleSystemCookies
                         handleMNPCookies:(BOOL)handleMNPCookies
                              OptionsDict:(NSDictionary *)optionsDict
                             successBlock:(APIRequestCompletionBlock)successBlock
                                  failure:(APIRequestFailureBlock)failBlock;

/**
根据reqInfo直接发起请求
@param reqInfo 包含请求地址url、
              参数params、
              headers(User-Agent、content-type、charset)、
              cookies(requestCookies)等
@param completionBlock    请求完成回调
@param failureBlock    请求失败回调
*/
+ (void)requestWithInfo:(BBASMCommonRequestInfo *)reqInfo
             completion:(BBASMRequestComplete)completionBlock
                failure:(BBASMRequestFail)failureBlock;

/**
 * @brief 根据AppId获取referer
 *
 * @param appId 应用ID
 * @param from referer是哪里需要添加的
 * @return referer
 */
+ (nullable NSString *)httpRefererWithAppId:(NSString *)appId from:(BBASMRefererCarrier)from;

/**
 * @brief 将APPID拼接到UA里
 *
 * @param userAgent 原来的UA
 * @param appID 小程序ID
 * @return UA
 */
+ (nullable NSString *)newUserAgentWithOld:(NSString *)userAgent appID:(NSString *)appID;

/**
 * @brief 从UA中获取appID
 *
 * @param userAgent UA
 * @return AppID
 */
+ (nullable NSString *)getAppIDFromUserAgent:(NSString *)userAgent;

/**
 * @brief 获取小程序框架统一UA (小程序UA + baseUA)
 *
 * @return 小程序框架统一UA
 */
+ (NSString *)getWebviewAppUserAgent;


/// @brief pms请求的公参
/// @return pms请求的公参
+ (NSDictionary *)requestPublicParameters;

/// @brief 发起经过加密的请求
/// @param originRequest 原始Request
/// @param bFromsmRequest 是否来自request端能力
+ (void)cryptoStartWith:(BBANormalAPIRequest *)originRequest isFromsmRequest:(BOOL)bFromsmRequest;

@end

NS_ASSUME_NONNULL_END