使用OAuth-Signpost和Apache HttpComponents签署POST请求的正确方法是什么?
我目前正在使用OAuth-Signpost Java库对从客户端发送到实现OAuth身份验证的服务器的请求进行签名。当发出GET请求(使用HttpURLConnection)时,一切都可以正常工作:请求被签名,参数被包括在内,签名在目标中匹配。但是,它似乎不适用于POST请求。我知道使用HttpURLConnection对POST进行签名时可能出现的问题,因此我为这些请求迁移到Apache HttpComponents库。我在以下示例中发送的参数是纯字符串和类似 XML 的字符串 ('rxml')。我的代码如下:
public Response exampleMethod(String user, String sp, String ep, String rn, String rxml){
//All these variables are proved to be correct (they work right in GET requests)
String uri = "...";
String consumerKey = "...";
String consumerSecret = "...";
String token = "...";
String secret = "...";
//create the parameters list
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", user));
params.add(new BasicNameValuePair("sp", sp));
params.add(new BasicNameValuePair("ep", ep));
params.add(new BasicNameValuePair("rn", rn));
params.add(new BasicNameValuePair("rxml", rxml));
// create a consumer object and configure it with the access
// token and token secret obtained from the service provider
OAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
consumer.setTokenWithSecret(token, secret);
// create an HTTP request to a protected resource
HttpPost request = new HttpPost(uri);
// sign the request
consumer.sign(request);
// set the parameters into the request
request.setEntity(new UrlEncodedFormEntity(params));
// send the request
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
//if request was unsuccessful
if(response.getStatusLine().getStatusCode()!=200){
return Response.status(response.getStatusLine().getStatusCode()).build();
}
//if successful, return the response body
HttpEntity resEntity = response.getEntity();
String responseBody = "";
if (resEntity != null) {
responseBody = EntityUtils.toString(resEntity);
}
EntityUtils.consume(resEntity);
httpClient.getConnectionManager().shutdown();
return Response.status(200).entity(responseBody).build();
}
当我向服务器发送POST请求时,我收到一个错误,告知签名(我发送的签名和服务器自行计算的签名)不匹配,因此我想这与它们签名的基本字符串和POST签名的工作方式有关,因为它们在两端处理相同的密钥和机密(已检查)。
我已经读到,一种方法是将参数设置为URL的一部分(如在GET请求中)。但是,它对我不起作用,因为XML参数可能超过URL长度,因此需要将其作为POST参数发送。
我想我做错了什么,无论是签署POST请求还是处理参数,但我不知道它是什么。拜托,你能帮帮我吗?
P.S:如果我缺乏上下文,错误痕迹或有关此问题的其他信息,我很抱歉,但我在这里是新手。因此,如果您需要,请不要犹豫,向我询问更多信息。