В настоящее время я использую библиотеку Java OAuth-Signpost для подписывания запросов, отправленных с клиента на сервер, который реализует аутентификацию OAuth. При создании запросов GET (с использованием HttpURLConnection) все работает нормально: запросы подписаны, параметры включены, а подписи совпадают по назначению. Однако, похоже, он не работает с запросами POST. Я знаю о проблемах, которые могут возникнуть при подписании POST с использованием HttpURLConnection, поэтому я перешел в библиотеку 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: Я извиняюсь, если мне не хватает контекста, ошибок ошибок или дополнительной информации по этой проблеме, но я новичок здесь. Поэтому, пожалуйста, не стесняйтесь спрашивать меня, если вам это нужно.