Printemps RestTemplate HTTP Post avec les paramètres de provoquer 400 bad request error
Possible de dupliquer Besoin d'aide sur RestTemplate Requête Post avec le Corps de Paramètres? et Printemps RESTtemplate POST mais ces réponses ne fonctionne pas pour moi
J'ai essayé d'obtenir un jeton d'accès de Instagram
API d'ici le Printemps Android. La demande de Instagram 's document comme ceci:
curl \-F 'client_id=CLIENT-ID' \
-F 'client_secret=CLIENT-SECRET' \
-F 'grant_type=authorization_code' \
-F 'redirect_uri=YOUR-REDIRECT-URI' \
-F 'code=CODE' \https://api.instagram.com/oauth/access_token
Voici ma demande de jeton d'accès (Après je reçois jeton de demande de succès):
MultiValueMap<String, String> mvm = new LinkedMultiValueMap<String, String>();
mvm.add("client_id", INSTAGRAM_CILENT_ID);
mvm.add("client_secret", INSTAGRAM_SECRET);
mvm.add("grant_type", "authorization_code");
mvm.add("redirect_uri", CALLBACKURL);
mvm.add("code", requestToken);
InstagramResult result = restTemplate .postForObject("https://api.instagram.com/oauth/access_token", mvm, InstagramResult .class);
Le résultat de la cartographie:
public class InstagramLogin {
public String access_token;
public InstagramUser user;
}
public class InstagramUser {
public String id;
public String username;
public String full_name;
public String profile_picture;
}
Et le reste modèle:
RestTemplate restTemplate = new RestTemplate();
final List<HttpMessageConverter<?>> listHttpMessageConverters = new ArrayList< HttpMessageConverter<?> >();
listHttpMessageConverters.add(new GsonHttpMessageConverter());
listHttpMessageConverters.add(new FormHttpMessageConverter());
listHttpMessageConverters.add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(listHttpMessageConverters);
Mais je reçois toujours des 400 bad request error. Voici mon stack trace:
04-03 09:32:45.366: W/RestTemplate(31709): POST request for "https://api.instagram.com/oauth/access_token" resulted in 400 (BAD REQUEST); invoking error handler
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): 09:32:46.862 Thread-32787 An exception occurred during request network execution :400 BAD REQUEST
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): org.springframework.web.client.HttpClientErrorException: 400 BAD REQUEST
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:524)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:481)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:317)
P/s: je suis sûrement mes valeurs de paramètres sont à droite, parce que j'ai testé en curl et il a bien fonctionné.
- pourquoi ne pas simplement une table de hachage?
- Depuis curl fonctionne et le code posté ne fonctionne pas. Si vous ne pouvez pas trouver une solution ici, j'ai couru les demandes de votre code et de roulage par fiddler. Prendre un regard sur les deux demandes et de comprendre ce qui est différent entre eux.
Vous devez vous connecter pour publier un commentaire.
Un serveur reviennent souvent un HTTP 400 si le type de contenu n'est pas acceptable pour une demande. Le curl exemple d'instagram utilise le
-F
paramètre qui spécifie multipart publier des données:Par conséquent, vous pouvez essayer de définir explicitement le type de Contenu d'en-tête HTTP dans votre RestTemplate demande:
Comme mentionné plus haut dans les commentaires, un outil de proxy comme fiddler peut être vraiment utile pour le débogage. L'enjeu de cette situation est que vous travaillez avec SSL, de sorte que ces outils ne seront pas en mesure de "voir" les communications cryptées sans configuration particulière.
Et de convertir votre réponse à la Chaîne. Vous pouvez utiliser:
Je suppose que vous voulez envoyer une requête post pour n'importe quel objet. Pour qu'un DefaultHttpClient est utilisé.
HttpPost Objet l'url en argument (uniquement l'url de ne pas les paramètres).
Les paramètres que vous souhaitez envoyer peut être modifié ci-dessus dans BasicNameValuePair objet. Premier paramètre le nom du paramètre et la deuxième serait sa valeur.
Dès que vous appelez la méthode execute la réponse viendra dans l'Objet HttpResponse.
Vous avez maintenant à convertir l'objet HttpResponse de l'Entité. Et à partir de laquelle vous pouvez appeler EntityUtils.méthode toString() pour convertir en Chaîne. Je suppose que vous vous attendez à un données json. Vous pourriez avoir à mapper une classe correspondant à convertir les données json à java de la classe de l'objet.