私は、パラメータとしてURLエンコードされた文字列を取り、通常のスプリング@Controllerを持っている:一貫性のない自動デコード
@RequestMapping(value = "/wechat/browser", method = GET)
public void askWeChatWhoTheUserIs(@RequestParam(name = "origin") String origin,
HttpServletResponse response) throws IOException {
//omitted codes
}
私は春のブートアプリケーションをデバッグし、ブラウザでエンドポイントをテストする場合:
私はSpring MVCのテストを書いたときcurl http://localhost:8080/wechat/browser\?origin\=http%3A%2F%2Fwww.example.com%2Findex.html%3Fa%3Db%23%2Froute
origin
は自動的に復号化され、http://www.example.com/index.html?a=b#/route
に等しい。しかししまった:
@RunWith(SpringRunner.class)
@WebMvcTest(WeChatOauthController.class)
public class WeChatOauthControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void itShouldRedirectToWeChatToFinishOauthProtocol() throws Exception {
String origin = "http://www.example.com/index.html?a=b#/route";
String encodedOrigin = URLEncoder.encode(origin, "UTF-8");
this.mvc.perform(get("/wechat/browser")
.param("origin", encodedOrigin))
.andDo(print())
//omitted codes
}
}
このテストとコントローラをデバッグすると、今回はorigin
がデコードされませんでした。なぜこれらの2つのケースで異なった動作をするのか不思議です。
_いない他の一つに、サーバーを持っている一つのケースでは_「それはこれらの2つのケースで異なる動作をする理由だけで不思議」:つまり
は、これを使用しています。あるケースでは完全に設定されたアプリケーションがあり、もう1つのアプリケーションではそうではありません。おそらく、あなたのテストにもURLデコードを設定する必要があります。 – zeroflagL
@zeroflagLは意味があります。春の起動時には、実際にはTomcatサーバーが組み込まれています。 URLを設定する方法を詳しく説明できますか? – Hippoom