gpt4 book ai didi

java - 使用 oAuth - fatsecret API 向 REST API 发送请求

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:43 27 4
gpt4 key购买 nike

我尝试向使用 oAuth 的 REST API 发送有效请求。我不断收到回复:“无效签名”

以下是我生成请求的步骤:

构建请求:

public String buildRequest() {

ArrayList<String> params = new ArrayList<>(generateParams());
params.add("oauth_signature=" + sign(buildSignatureBaseString()));

Collections.sort(params);

return join(params.toArray(template), "&");
}

创建签名基字符串:

public String buildSignatureBaseString(){

StringBuilder builder = new StringBuilder();

builder.append(METHOD);
builder.append("&");
builder.append(percentEncoding(URL));
builder.append("&");
builder.append(percentEncoding(join(generateParams().toArray(template), "&")));

return builder.toString();
}

生成按自然顺序排序的参数:

private ArrayList<String> generateParams() {

ArrayList<String> params = new ArrayList<>();

params.add("oauth_consumer_key=" + "...");
params.add("oauth_signature_method=HMAC-SHA1");
params.add("oauth_timestamp=" + Long.valueOf(System.currentTimeMillis() / 1000).toString());
params.add("oauth_nonce=" + getNonce());
params.add("oauth_version=1.0");
params.add("format=json");
params.add("method=foods.search");
params.add("search_expression=pasta");

Collections.sort(params);

return params;
}

创建签名基字符串:

public String buildSignatureBaseString(){

StringBuilder builder = new StringBuilder();

builder.append(METHOD);
builder.append("&");
builder.append(percentEncoding(URL));
builder.append("&");
builder.append(percentEncoding(join(generateParams().toArray(template), "&")));

return builder.toString();
}

使用 HMAC-SHA1 生成签名:

public String sign(String sbs) {

String key = <SharedSecret> + "&";
SecretKeySpec sk = new SecretKeySpec(key.getBytes(Charset.forName("UTF-8")), ALGORITHM);
try {
Mac m = Mac.getInstance(ALGORITHM);
m.init(sk);
byte[] hmacEncoded = m.doFinal(sbs.getBytes(Charset.forName("UTF-8")));
byte[] base64Encoded = Base64.encode(hmacEncoded, Base64.DEFAULT);
return Uri.encode(new String(base64Encoded, Charset.forName("UTF-8")));
} catch (java.security.NoSuchAlgorithmException e) {
Log.w("FatSecret_TEST FAIL", e.getMessage());
return null;
} catch (java.security.InvalidKeyException e) {
Log.w("FatSecret_TEST FAIL", e.getMessage());
return null;
}
}

在这件事上更有经验的人可以帮忙吗?

问候

最佳答案

generateParams 中的参数条目均采用 tag=value 的形式。您的符号方法似乎只返回一个值。

并且:你确定sign方法不会抛出异常吗?在这种情况下,您将返回 null,您应该在调用者方法中检查它,并且仅在它不为 null 时才将其添加到参数中

关于java - 使用 oAuth - fatsecret API 向 REST API 发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40202483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com