use*_*804 5 java spring json oauth
public String requestAccessToken(String username, String password, String oauthaurl) {
log.info("Request access token");
String token = null;
List<HttpMessageConverter<?>> converters = getMessageConverters();
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(converters);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> oauthPayload = new LinkedMultiValueMap<String, String>();
oauthPayload.add("username", username);
oauthPayload.add("password", password);
oauthPayload.add("grant_type", "password");
HttpEntity<?> request = new HttpEntity<>(oauthPayload, headers);
ResponseEntity<?> response = restTemplate.postForEntity(oauthaurl, request, Object.class);
log.info(response.getStatusCode().toString());
log.info(response.getBody().toString());
JSONObject jsonObject = new JSONObject(response.getBody());
log.info(jsonObject.toString());
//get access_token from jsonObject here
return token;
}
Run Code Online (Sandbox Code Playgroud)
我从令牌网址请求OAuth访问令牌的方法遇到麻烦。我实际上是从服务器获取带有access_token的响应,我在解析响应时遇到了麻烦。
log.info(response.getBody().toString());
Run Code Online (Sandbox Code Playgroud)
退货
{access_token=EI79TeB_Vavu-vgl5WLp8CNWpLUWQBpS3Cm4uU-C1VCJkQJFEo2SthMjPN4gmvQ9ZpQu6Iku11mnvZSUKPVim0MsAEpcMbBdIWl3AMiXCfv9OeqfJRK_1wwIyjo5brDeHK8L5XJPsg98mEKL41qg2IW0Ks9TeYbkRyw4CFKwjcuTi3W3toLBlEGOEinNnrrj6bhOjwaaCVT7zWAIVoImXa-h0VTsoCn2XRVoCO7GENV-Qx55JzTFPJhe2sg72HgRbN8kTID_AcsN8wSKRTQ3T0N74Ks8dfs3YRx0NP4-ADByMcMEnyP8IGoCPHwANNwA8JpYaL2pijWBjOm7VSA53B9Knqxv1EYajBFYXfy74jYUFqlGTKLRUtuKomJh_d9OHM04V-q7xgtlg9upB3s9ORXjbTmzRDzq9U4P67FGJdQe4D4WKUju7oNtjkDzbQZEp0A9fxyHxHFI7MRP4mwPuxMldgytX8Oc1SqoakFre7qzxldaitWqKqnt217e7N7G, token_type=bearer, expires_in=1209599, userName=xxx, .issued=Thu, 02 Mar 2017 16:03:08 GMT, .expires=Thu, 16 Mar 2017 16:03:08 GMT}
Run Code Online (Sandbox Code Playgroud)
我想做的就是将响应主体转换为JSONObject,这样我就可以将access_token作为String获取。
JSONObject jsonObject = new JSONObject(response.getBody());
log.info(jsonObject.toString());
Run Code Online (Sandbox Code Playgroud)
似乎不起作用-结果是
{}
Run Code Online (Sandbox Code Playgroud)
有人可以指出我正确的方向吗?谢谢!
编辑:
编码器-当我替换这些行时,我得到如下的堆栈跟踪
2017-03-02 11:16:00.040 INFO 99914 --- [ main] c.u.e.service.EventRecor
at [Source: java.io.PushbackInputStream@1a38c59b; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:60)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2922)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:237)
... 18 more
Run Code Online (Sandbox Code Playgroud)
编码器-尝试您的最新版本,我得到了此堆栈跟踪
2017-03-02 11:16:00.040 INFO 99914 --- [ main] c.u.e.service.EventRecor
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: org.springframework.web.client.HttpClientErrorException: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:628)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:549)
at com.comp.eventrecorder.service.EventRecorderServiceImpl.requestAccessToken(EventRecorderServiceImpl.java:182)
at com.comp.eventrecorder.service.EventRecorderServiceImpl.startProcessing(EventRecorderServiceImpl.java:57)
at com.comp.eventrecorder.Application.main(Application.java:32)
... 8 more
Run Code Online (Sandbox Code Playgroud)
编码器-该请求来自邮递员fyi
注意:我可能会以错误的方式指出您。保留您的初始代码,然后尝试
JSONObject jsonObject = new JSONObject(response.getBody().toString());
log.info(jsonObject.getString("access_token"));
Run Code Online (Sandbox Code Playgroud)
初步答案:
问题似乎是您正在使用Object类检索响应实体。将其修改为字符串类,并让您进行如下调用:
ResponseEntity<String> response = restTemplate.postForEntity(oauthaurl, request, String.class);
JSONObject jsonObject = new JSONObject(response.getBody());
log.info(jsonObject.getString("access_token"));
Run Code Online (Sandbox Code Playgroud)
编辑
根据stacktrace,您可能不得不像使用MultiValueMapand 一样使用自定义实现LinkedMultiValueMap。而不是那样修改您的代码,如下所示。
public String requestAccessToken(String username, String password, String oauthaurl) {
log.info("Request access token");
String token = null;
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(oauthaurl)
.queryParam("grant_type", "password")
.queryParam("username", username)
.queryParam("password", password);
URI myUri=builder.buildAndExpand().toUri();
HttpEntity<?> request = new HttpEntity<>(headers);
ResponseEntity<String> rs = restTemplate.exchange(myUri, HttpMethod.POST, request,String.class);
JSONObject jsonObject = new JSONObject(rs.getBody());
log.info(jsonObject.getString("access_token"));
//get access_token from jsonObject here
return token;
}
Run Code Online (Sandbox Code Playgroud)
让我知道您是否需要澄清!
JSONObject jsonObject = new JSONObject();
String tokens[]=response.getBody().toString().replace("}","").replace("{","").split(",");
for(String s:tokens){
String split = s.split("=");
jsonObject.put(split[0],split[1]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |