1

在将微博的 Android SDK 集成到应用程序中时,我发现HttpClient它包含的类使用了 Android 非常不喜欢的过时库(实际上我认为他们只是将 Java SDK 粘贴到 Android Eclipse 项目中并发布了它)。这个库似乎只在微博中执行一个功能,即组装 POST 请求(使用PostMethod类)并将它们发送到微博服务器。HttpPost我兴高采烈地假设用 Android 中包含的标准 Apache 替换它会相对简单。

不幸的是,该Part课程似乎没有直接的等价物。至少有些Parts 可以用BasicNameValuePair类代替,但是Part微博有一个自定义的看起来更像ByteArrayEntity.

检查称为multPartUrl(不是错字)的两种方法

HttpClient的微博来源

第一个在此处复制(第二个非常相似,但粘贴了不同类型的内容):

public Response multPartURL(String url,  PostParameter[] params,ImageItem item,boolean authenticated) throws WeiboException{
  PostMethod post = new PostMethod(url);
  try {
    org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
    long t = System.currentTimeMillis();
    Part[] parts=null;
    if(params==null){
      parts=new Part[1];
    }else{
      parts=new Part[params.length+1];
    }
    if (params != null ) {
      int i=0;
        for (PostParameter entry : params) {
          parts[i++]=new StringPart( entry.getName(),(String)entry.getValue());
      }
        parts[parts.length-1]=new ByteArrayPart(item.getContent(), item.getName(), item.getImageType());
      }
    post.setRequestEntity( new MultipartRequestEntity(parts, post.getParams()) );
     List<Header> headers = new ArrayList<Header>();

     if (authenticated) {
              if (basic == null && oauth == null) {
              }
              String authorization = null;
              if (null != oauth) {
                  // use OAuth
                  authorization = oauth.generateAuthorizationHeader( "POST" , url, params, oauthToken);
              } else if (null != basic) {
                  // use Basic Auth
                  authorization = this.basic;
              } else {
                  throw new IllegalStateException(
                          "Neither user ID/password combination nor OAuth consumer key/secret combination supplied");
              }
              headers.add(new Header("Authorization", authorization));
              log("Authorization: " + authorization);
          }
      client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
    client.executeMethod(post);

    Response response=new Response();
    response.setResponseAsString(post.getResponseBodyAsString());
    response.setStatusCode(post.getStatusCode());

    log("multPartURL URL:" + url + ", result:" + response + ", time:" + (System.currentTimeMillis() - t));
      return response;
  } catch (Exception ex) {
     throw new WeiboException(ex.getMessage(), ex, -1);
  } finally {
    post.releaseConnection();
  }
}

可以看出,aPart中添加了若干个 s MultiPartRequestEntity,其中最后一个是字节数组或文件。

  • 什么(如果有的话)相当于MultiPartRequestEntity最新的 Apache 库中的什么?
  • 有没有办法将字节数组添加到 a UrlEncodedFormEntity
  • 有没有一种方法可以将名称-值对添加到 a 中ByteArrayEntity
  • 还有什么我完全想念的吗?
4

1 回答 1

0

到目前为止,我发现的最佳答案似乎是基于这个问题的答案:

使用 Android SDK 发布多部分请求

这显示了从哪里获得微博使用的库的非过时替代品。

然后我换了

Part[] parts=null;
if(params==null){
  parts=new Part[1];
}else{
  parts=new Part[params.length+1];
}
if (params != null ) {
  int i=0;
    for (PostParameter entry : params) {
      parts[i++]=new StringPart( entry.getName(),(String)entry.getValue());
  }
    parts[parts.length-1]=new ByteArrayPart(item.getContent(), item.getName(), item.getImageType());
  }
post.setRequestEntity( new MultipartRequestEntity(parts, post.getParams()) );

        MultipartEntity entity = new MultipartEntity();
        if(params!=null) {
            for (PostParameter entry : params) {
                entity.addPart(entry.getName(), new StringBody(entry.getValue()));
            }
        }

        entity.addPart("filename", new ByteArrayBody(item.getContent(), item.getImageType(), item.getName()));

我不是 100% 确定最后一行,因为我是基于微博自己的类,它设置了一个filename参数;然而,它很可能被称为别的东西,虽然不清楚。

然后,我将 替换为HttpClientanAndroidHttpClient并使用标准AndroidHttpClient方法来获取状态代码,并将 anInputStream替换为来自实体的内容;这个流,我传入微博Response类并读入它作为主要成员的字符串。这些假设可能是错误的,但我会继续研究它。

于 2013-03-06T16:09:27.120 回答