2.
使用 MFC 的 BEGIN_INTERFACE_PART 宏创建一个内部类,使其实现 IHttpNegotiate 接口。MFC 会将 IHttpNegotiate 查询委托给这个内部类。这些应该在该类的 .h 文件中。
BEGIN_INTERFACE_PART(HttpNegotiateObj, IHttpNegotiate)
STDMETHOD_(HRESULT, BeginningTransaction)(LPCWSTR szUrl,
LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
STDMETHOD_(HRESULT, OnResponse)(DWORD dwResponseCode,
LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR*
pszAdditionalRequestHeaders)
END_INTERFACE_PART(HttpNegotiate
关于OKHTTP拦截器Interceptor很强大,很好用。因为公司有个需求需要对所有请求接口添加共有参数并且对共有参数进行签名。在OKHTTP中GET的请求参数和POST表单形式的参数很容易获取,但是对于BODY类型的一时没想到解决办法,后来想了想发现其实都是可以做的。
GET方法直接url.request().query()即可获得key=value&key=value形式的参数,可以直接拼凑参数,然后签名。
POST方法:有三种情况,表单,body,multipart三种情况,对于multipart主要是文件,一般过滤掉。
重要源码:
if (requestBody instanceof FormBody) {for (int i =0i <((FormBody) requestBody).size()i++) {rootMap.put(((FormBody) requestBody).encodedName(i), ((FormBody) requestBody).encodedValue(i))}} else {//buffer流Buffer buffer = new Buffer()requestBody.writeTo(buffer)String oldParamsJson = buffer.readUtf8()rootMap = mGson.fromJson(oldParamsJson, HashMap.class) //原始参数rootMap.put("publicParams", commomParamsMap) //重新组装String newJsonParams = mGson.toJson(rootMap) //装换成json字符串request = request.newBuilder().post(RequestBody.create(JSON, newJsonParams)).build()}
具体靠参考:http://blog.csdn.net/wuyinlei/article/details/57087872
一个最简单的OkHttpClient
一个复杂点的OkHttpClient配置
具体可配置参数见OkHttpClient.Builder类,几点注意事项:
两种拦截器的区别
官方提供的Logging Interceptor
地址: https://github.com/victorfan336/okhttp-logging-interceptor
gradle.build中添加依赖:
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
通过Request.Builder创建请求,默认是Get请求
主要是构建RequestBody,并设置Content-Type消息头。
1.普通Post请求
比如json请求
2. 使用FormBody传递键值对参数
Content-Type: application/x-www-form-urlencoded
比如:
3. 使用RequestBody传递Json或File对象
4. 使用MultipartBody同时传递键值对参数和File对象
5. 使用MultipartBody提交分块请求
6. 自定义RequestBody实现流的上传
1、同步执行
由于android强制要求网络请求在线程中执行,所以无法使用execute
2、异步执行
1. 设置请求头
2. 设置超时
3. 设置缓存
1、对于Get请求,如果请求参数较多,自己拼接Url较为麻烦
比如
拼接结果: http://www.baidu.com/user/login/username=zhangsan&password=123456
如果能做一些封装,直接addParam(key,value)的形式则会简单很多。
2、Callback在子线程中回调,大部分时候,我们都是需要更新UI的,还需自己post到主线程中处理。
3、构建请求步骤比较多
因此,Square提供了针对OkHttp的封装库Retrofit,另外Github上也有很多第三方的封装库,比如OkGo。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)