web-dev-qa-db-ja.com

SpringMVC-別のRESTサービス内からRESTサービスを呼び出す

現在、別のサービスの内部からRESTサービスを呼び出すときに非常に奇妙な問題が発生しており、自分が間違っていることを解決するために本当に手を使うことができました。

最初に、少しコンテキストがあります:

RESTサービスを呼び出してユーザーアカウントを作成するWebアプリがあります(この説明のために、エンドポイントはlocalhost:8080/registerです)。ユーザージャーニーの早い段階で、ユーザーのログイン資格情報を作成するために別のサービスを呼び出しましたlocalhost:8090/signupが、/ registerの呼び出しでいくつかのことを確認する必要があるため、呼び出し内で別のエンドポイントに呼び出していますこの情報を取得するには、8090に(localhost:8090/availability)。簡単に言うと、webappはlocalhost:8080/registerを呼び出し、次にlocalhost:8090/availabilityを呼び出します。

RESTクライアントまたはwebapp自体から可用性エンドポイントを直接呼び出すと、すべてが期待どおりに機能しますが、奇妙な理由で、呼び出し内からレジスタエンドポイントに呼び出すとHTTP415。誰が何が悪いのかについて何か洞察がありますか?

レジスタコントローラは次のようになります。

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {

    // a load of business logic that validates the user model

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
            userModel.getUsername(), Boolean.class);
    System.out.println(response.getBody());

    // a load more business logic

    return userModel;
}

また、可用性コントローラーは次のようになります。

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public Boolean isUsernameAvailable(@RequestBody String username) {

    // a load of business logic that returns a boolean
    return Boolean.TRUE;
}

完全な開示-実際には、createUser()のコンテンツとして示したものは、実際にはコールスタックを数回呼び出したものであり、WebAppからサービスを呼び出すために使用するのと同じクラスを使用しています(このコンテキストでは完全に機能します)。 、そして私は実際にはisUsernameAvailableでtrueを返すだけではありませんが(それはばかげているため)、これは問題を複製するコードの最も単純なバージョンです。

私の現在の仮定は、私がそれを見たときに自分自身を蹴り飛ばそうとしていることをしているということですが、私はこのコードをもう見ることができないほど長く見つめています。

編集以下のVikdorのコメントは、私にとってこの問題を解決しました。 createUserメソッドを次のように変更しました。

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {

    // a load of business logic that validates the user model

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
    ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
            userModel.getUsername(), Boolean.class);
    System.out.println(response.getBody());

    // a load more business logic

    return userModel;
}
5
Rob

HTTP415サポートされていないメディアタイプを意味します。つまり、isUsernameAvailableはJSON形式の入力を期待していますが、それはそれが取得しているものではありません。

次の手順を実行して、HTTPリクエストにContent-Type: application/jsonヘッダーを明示的に追加してみてください。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
restTemplate.put(uRL, entity);
2

下記のRestTemplate.exchangeを使用してください:

ResponseEntity responseEntity = RestTemplate.exchange(endPointURL、HttpMethod.GET/POST/PUT/DELETE、HttpEntity/headers、uriVariables)

endpointURL-SOAP End point URL、RESTサービスが消費する必要があります。

HTTPMethod-GET、PUT、POST、DELETEなどのメソッドタイプ.

HTTPEntity-SOAPは必須のsender/headers/{a}に必要です。必ずヘッダー名と値をHTTPヘッダーのkey-Valyeペアとして設定してください。

riVariablesObject ... urivariables)(String.class、Integer.classなど)

また、restTemplateへの要求を生成するときに、コンストラクターに---(connectTimeoutisSSLDisabledresponseCachedを配置する必要があります。

0
Aastha Jain