1

WeiboのAndroidSDKをアプリに統合しているときに、HttpClientそこに含まれるクラスが、Androidが非常に嫌う古いライブラリを使用していることを発見しました(実際、JavaSDKをAndroidEclipseプロジェクトに貼り付けて出荷しただけだと思います)。このライブラリは、Weibo内でPOSTリクエストを(PostMethodクラスを使用して)アセンブルしてWeiboサーバーに送信するという単一の機能のみを実行しているようです。HttpPostこれをAndroidに含まれている標準のApacheに置き換えるのは比較的簡単だと思いました。

残念ながら、このPartクラスには単純な同等のものがないようです。少なくともいくつかのsはクラスでPart置き換えることができますが、Weiboによって定義されたカスタムがあります。これは。のように見えます。BasicNameValuePairPartByteArrayEntity

multPartUrl(タイプミスではなく)と呼ばれる2つの方法を調べる

WeiboのHttpClientのソース

最初のものはここに複製されます(2番目は非常に似ていますが、異なるタイプのコンテンツに貼り付けられます):

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();
  }
}

にいくつかのPartsが追加されMultiPartRequestEntity、最後がバイト配列またはファイルであることがわかります。

  • MultiPartRequestEntity(もしあれば)より最新のApacheライブラリと同等のものは何ですか?
  • バイト配列をに追加する方法はありUrlEncodedFormEntityますか?
  • あるいは、名前と値のペアを?に追加する方法はありByteArrayEntityますか?
  • 私が完全に見逃しているものは他にありますか?
4

1 に答える 1

0

私がこれまでに見つけた最良の答えは、この質問に対する答えに基づいているようです。

AndroidSDKを使用してマルチパートリクエストを投稿する

これは、Weiboが使用するライブラリの廃止されていない代替品を入手する場所を示しています。

その後、交換しました

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()));

filenameパラメータを設定するWeibo自身のクラスに基づいているため、最後の行について100%確信はありません。ただし、明確ではありませんが、別の名前で呼ぶこともできます。

HttpClient次に、をに置き換え、AndroidHttpClient標準AndroidHttpClientのメソッドを使用してステータスコードを取得しInputStream、をエンティティからのコンテンツに置き換えました。このストリームでは、WeiboResponseクラスに渡して、メインメンバーとしての文字列を読み込んでいます。これらの仮定は間違っているかもしれませんが、私はそれを調査し続けます。

于 2013-03-06T16:09:27.120 に答える