0

私は Flickr API を理解しようとしている初心者です。写真を Flickr にアップロードする簡単なアプリを作成しようとしています。

写真をアップロードするリクエストを送信しようとすると、「無効な署名」という応答が返されます。

これは私の署名の基本文字列です。

POST&http%3A%2F%2Fapi.flickr.com%2Fservices%2Fupload&oauth_consumer_key%3D3f1e1948c1db9a45ca95febef6f5590e%26oauth_nonce%3D6151b3221a15f56c82ba0df47d57637e%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366133923%26oauth_token%3D72157633261587382-7dcbe2359dbcfb06%26oauth_version%3D1.0

基本的には、ユーザーの認証を要求したときと同じことを行いましたが、アクセス トークンを引数として使用しました。

これはリクエストの私のコードです:

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;

import org.apache.commons.codec.DecoderException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class Test {

  /**
   * @param args
 * @throws DecoderException 
 * @throws SignatureException 
 * @throws NoSuchAlgorithmException 
   */
  public static void main(String[] args) throws NoSuchAlgorithmException, SignatureException, DecoderException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://api.flickr.com/services/upload");

    try {
      FileBody bin = new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"));

      MultipartEntity reqEntity = new MultipartEntity();
      reqEntity.addPart("photo", bin);

      reqEntity.addPart("api_key", new StringBody(Utils.consumer_key));
      reqEntity.addPart("oauth_token", new StringBody(Utils.oauth_token));
      reqEntity.addPart("api_sig", new StringBody(Request.sig()));
      httppost.setEntity(reqEntity);

      System.out.println("Requesting : " + httppost.getRequestLine());
      ResponseHandler<String> responseHandler = new BasicResponseHandler();
      String responseBody = httpclient.execute(httppost, responseHandler);

      System.out.println("responseBody : " + responseBody);

    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      httpclient.getConnectionManager().shutdown();
    }
  }

}

MIME リクエストの送信に関する私の理解に問題がありますか?それとも署名だけですか? もしそうなら、どのように署名を作成すればよいですか? ありがとうございました。

4

2 に答える 2

0

問題は FileBody コンストラクターにあると思います

FileBody bin = new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"));

このコンストラクタを使用すると、MultiPart Encoding の結果は

Content-Disposition: フォームデータ。名前="写真";

予想されるリクエストは次の形式である必要があります

Content-Disposition: フォームデータ。名前="写真"; filename="無題-1.png"

したがって、ここで使用する正しいコンストラクタは次のとおりです。

new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"),ContentType.APPLICATION_OCTET_STREAM, "Untitled-1.png")

私はあなたのコードを自分で実行しようとはしていませんが、これで問題が解決することを願っています。

于 2013-05-26T13:46:45.483 に答える