2013-04-16 216 views
0

我是一個試圖找出Flickr API的初學者。 我正在嘗試創建一個將圖片上傳到Flickr的簡單應用程序。上傳照片到flickr(Java)

在嘗試發送我的上傳照片的請求時,我收到了「無效簽名」響應。

這是我對我的簽名基本字符串:

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要求的理解,還是僅僅是簽名?如果是這樣,我應該如何構建我的簽名? 謝謝。

回答

0

我相信問題是與FileBody構造

FileBody倉=新FileBody(新文件(「/用戶/ [名爲myUsername] /桌面/無標題-1。PNG 「));

如果此構造比多部分編碼的結果所使用是

內容處置:形狀數據;名稱=」 照片「;

鑑於預期的請求的形式應爲

內容處置的:形式數據;名稱=「照片」;文件名=「無標題-1.png」

所以正確的構造函數來這裏使用的是

新FileBody(新文件( 「/用戶/ [名爲myUsername] /Desktop/Untitled-1.png」),ContentType.APPLICATION_OCTET_STREAM,「無題-1.png「)

雖然我沒有嘗試自己執行代碼,但希望這可以解決您的問題。

0

基本上做任何與Flickr api你需要某種類型的授權「令牌」 - 並根據你如何去認證,你可能會得到不同的授權令牌。有2種類型的授權令牌:

  1. OAuth令牌 - 如果你這樣做OAuth認證
  2. 身份驗證令牌 - 如果你使用舊deprecated authentication method

Flickr的API文檔只說明瞭如何使用身份驗證令牌(#2)上傳,但也可以使用Oauth上傳以獲取oauth令牌(僅未記錄)。您的問題似乎是,您正在將您的後續令牌與Flickr的身份驗證令牌上傳方法混在一起。

如果你打算使用OAuth認證,您將需要通過API_KEYapi_sig的端Oauth等價物,這是oauth_consumer_keyoauth_signature。此外,適當的Oauth有效載荷應包含oauth_timestampoauth_nonceoauth_signature_methodoauth_version。其他

有一點要注意:您還需要通過燙髮=寫在你原來的OAuth認證 PARAM,這樣寫權限爲您OAuth令牌啓用 - 否則你將缺乏權限上傳。