我是初学者,试图找出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请求的理解有问题,还是只是签名?如果是这样,我应该如何构建我的签名? 谢谢。
答案 0 :(得分:0)
基本上要对Flickr API执行任何操作,您需要某种类型的授权“令牌” - 根据您的身份验证方式,您可能会获得不同的授权令牌。授权令牌有两种类型:
Flickr的api文档仅显示如何使用身份验证令牌(#2)上传,但也可以使用Oauth上传以获取 oauth令牌(只是没有记录)。您的问题似乎是将 ouath令牌与Flickr的身份验证令牌上传方法混合在一起。
如果您要使用Oauth身份验证,则需要传递 api_key 和 api_sig 的Oauth等效项,这些 oauth_consumer_key 和<强> oauth_signature 即可。此外,正确的Oauth有效负载应包含 oauth_timestamp , oauth_nonce , oauth_signature_method 和 oauth_version 。
还有一点需要注意:您还需要在原始Oauth身份验证中传递 perms = write 参数,以便为 oauth令牌启用写入权限 - 否则你将缺乏上传的权限。
答案 1 :(得分:0)
我认为问题在于FileBody构造函数
FileBody bin = new FileBody(新文件(“/ Users / [MYUSERNAME] /Desktop/Untitled-1.png”));
如果使用此构造函数而不是MultiPart Encoding的结果
内容 - 处置:表单数据; NAME = “照片”;
预期请求的格式应为
内容 - 处置:表单数据; NAME = “照片”;文件名= “无标题-1.png”
所以这里使用的正确构造函数是
new FileBody(新文件(“/ Users / [MYUSERNAME] /Desktop/Untitled-1.png”),ContentType.APPLICATION_OCTET_STREAM,“Untitled-1.png”)
虽然我自己没有尝试过执行代码,但希望这可以解决您的问题。