Tag Archives: 微博

HttpClient 4.3中Https的使用方法

开发Android版Do+新浪微博客户端时使用到了HTTPClient库,当时刚刚接触API接口开发很多都不懂,直接调用HTTPS时直接报证书错误,后来查找资料发现,HTTPClient在请求HTTPS时也需要证书认证。通过自定义HTTPClient顺利实现了接口调用。最近在做另外一个项目,也会通过HTTPClient来调用第三方的API,所以又查看了一下HTTPClient的源码,把HTTPS的请求方式重新梳理一下。

注意:Android项目中内嵌的HTTPClient库版本为4.2.3,详见此处。下面介绍中使用的库为4.3,两者之间有些差异。4.3当前为开发版,谨慎使用。

以新浪微博API为例,

1、通过浏览器下载https://api.weibo.com的证书

Chrome浏览器,地址栏中键入“https://api.weibo.com/oauth2/authorize”,点击左侧绿色锁状图标,选择”连接”选项卡,点击”证书信息”

IE浏览器,地址栏中键入“https://api.weibo.com/oauth2/authorize”,点击右侧橙色锁状图标,点击”查看证书信息”

弹出对话框,选择“详细信息”选项卡,右侧点击“复制到文件”,进入证书导出向导,点击”下一步”,选择”Base64 编码 X.509(.CER)(S)”,点击”下一步”,选择证书保存位置。证书导出成功。

2、加载证书信息,构造KeyStore。默认将证书****.cer放在src下

3、构造SSLContext

4、创建可用Scheme

5、创建ConnectionManager,添加Connection配置信息

6、构建HTTPClient

HttpClients.custom().setConnectionManager(conManager).build();

7、发起HTTP Request

 

8、当前默认编码为UTF-8.在之前版本中设置编码是通过BasicParam设置为HTTP.UTF-8

在新版本中改为Config模式,参数为Consts.UTF-8。

 

新浪微博上传图片—Android代码示例

在做新浪微博客户端上传图片时,API的解释一直很不给力,由于上传图片必须模拟HttpClient的行为模式,导致移动客户端的上传图片模块开发比较棘手。无奈只能旁征博引,参考其他资料,以下代码在Android平台下测试已经通过。

参考资料:人人网API腾讯微博API

public class HttpFormImage {

private final static String CN = “HttpFormImage”;
private final static String BOUNDARY = “sdg8sf8vdsd8”;
private final static String MP_BOUNDARY = “–” + BOUNDARY;
private final static String END_MP_BOUNDARY = “–” + BOUNDARY + “–“;

public boolean sendMsg(String url, String access_token, String text,
File image,String imageType) {

ByteArrayOutputStream bos = null;
byte[] data = null;
try {
HttpPost post = new HttpPost(url);
post.setHeader(“Content-Type”, “multipart/form-data; boundary=”
+ BOUNDARY);

bos = new ByteArrayOutputStream();

paramToUpload(bos, “access_token”, access_token);
paramToUpload(bos, “status”, text);

imageContentToUpload(bos, image,imageType);

data = bos.toByteArray();
bos.close();
ByteArrayEntity formEntity = new ByteArrayEntity(data);
post.setEntity(formEntity);

HttpResponse response = new DefaultHttpClient().execute(post);

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) {
Log.i(CN + “_sendMsg”, statusCode + “”);
return true;
} else if (statusCode > Const.ERR_ERR) {
Log.e(CN + “_sendMsg”, Weto.exp2str(statusCode) + “”);
return false;
} else {
Log.e(CN + “_sendMsg”, statusCode + “”);
return false;
}
} catch (Exception e) {
Log.e(CN + “_sendMsg”, Const.EXP_IO + “”, e);
}
return false;
}

/***
*
* @param bos
* outputstream ,write to network
* @param key
* parameter name
* @param value
* parameter value
*/
private static void paramToUpload(OutputStream bos, String key, String value) {

StringBuilder temp = new StringBuilder(10);
temp.setLength(0);
temp.append(MP_BOUNDARY).append(“rn”);
temp.append(“content-disposition: form-data; name=””).append(key)
.append(“”rnrn”);
temp.append(value).append(“rn”);
byte[] res = temp.toString().getBytes();
try {
bos.write(res);
} catch (IOException e) {
Log.e(CN + “_paramToUpload”, Const.EXP_IO + “”, e);
}
}

/***
*
* @param out
* outputStream,write to server
* @param file
* File
* @param imageType
* image type==image/jpg,image/png, image/gif
*/
private static void imageContentToUpload(OutputStream out, File file,
String imageType) {

StringBuilder temp = new StringBuilder();

temp.append(MP_BOUNDARY).append(“rn”);
temp.append(“Content-Disposition: form-data; name=”pic”; filename=””)
.append(file.getName()).append(“”rn”);
temp.append(“Content-Type: “).append(imageType).append(“rnrn”);
byte[] res = temp.toString().getBytes();
FileInputStream input = null;
try {
out.write(res);
input = new FileInputStream(file.getAbsoluteFile());
byte[] buffer = new byte[1024 * 50];
while (true) {
int count = input.read(buffer);
if (count == -1) {
break;
}
out.write(buffer, 0, count);
}
out.write(“rn”.getBytes());
out.write((“rn” + END_MP_BOUNDARY).getBytes());
} catch (IOException e) {
Log.e(CN + “_imageContentToUpload”, Const.EXP_IO + “”, e);
} finally {
if (null != input) {
try {
input.close();
} catch (IOException e) {
Log.e(CN + “_imageContentToUpload”, Const.EXP_IO + “”, e);
}
}
}
}
}