GVKun编程网logo

Spring-可以在post方法的请求映射中提供相同的url吗?(spring post请求)

15

本文将为您提供关于Spring-可以在post方法的请求映射中提供相同的url吗?的详细介绍,我们还将为您解释springpost请求的相关知识,同时,我们还将为您提供关于ASP.NETWebAPI可

本文将为您提供关于Spring-可以在post方法的请求映射中提供相同的url吗?的详细介绍,我们还将为您解释spring post请求的相关知识,同时,我们还将为您提供关于ASP.NET Web API可以在与MVC相同的URL上工作吗?、HttpClient4.0 应用二 Post方法的URI获取、Java Spring Boot请求方式与请求映射过程分析、java – 在Spring RESTful服务中使用相同的URL和相同的方法来使用不同的输入JSON格式的实用信息。

本文目录一览:

Spring-可以在post方法的请求映射中提供相同的url吗?(spring post请求)

Spring-可以在post方法的请求映射中提供相同的url吗?(spring post请求)

是否可以在两个不同的post方法的请求映射中使用相同的url,仅请求正文有所不同。

答案1

小编典典

不,您不能在具有不同请求主体类型但介质类型相同的post方法的请求映射中提供相同的url。以下将不起作用:

  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)  public String hello(@RequestBody Pojo1 val) {    return "Hello";  }  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)  public String hello(@RequestBody Pojo2 val) {    return "Hello";  }

如果您使用不同的媒体类型,那么它将。下面将工作:

  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)  public String hello(@RequestBody Pojo val) {    return "Hello";  }  @PostMapping(path = "/hello", consumes = MediaType.TEXT_PLAIN_VALUE)  public String hello(@RequestBody String val) {    return "Hello";  }

RequestMapping在至少一项条件上应有所不同;path,method,params,headers,consumes,produces

ASP.NET Web API可以在与MVC相同的URL上工作吗?

ASP.NET Web API可以在与MVC相同的URL上工作吗?

我可以为返回 HTML的ASP.NET MVC请求和返回 JSON的ASP.NET Web API提供相同的URL吗?

我在例子中看到这样的路线:“api / {id}”但是我可以摆脱这个api / part并在MVC(而不是Web API)中使用这个地址吗?

一方面,这应该是可能的,因为我们有内容谈判.但是这样我需要两条具有相同地址的路由,所以这没有意义,对吧?

换句话说:我可以让Controller和ApiController具有相同的URL吗?或者我也应该将ApiController用于HTML?

解决方法

如前面的答案中所述,你不能做这样的事情,我真的不明白你为什么要做那样的事情.

但是我不同意你应该在一个项目中坚持一件事,如果你想要一个干净的API然后我会去webapi并使用MVC来托管我的页面,那时我会把API放在一个单独的文件夹加上单独的路线.

HttpClient4.0 应用二 Post方法的URI获取

HttpClient4.0 应用二 Post方法的URI获取

Post方法来得更加直观,有时候,Get请求实在有点长:

List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity);

原文链接: http://blog.csdn.net/ostrichmyself/article/details/4496145

Java Spring Boot请求方式与请求映射过程分析

Java Spring Boot请求方式与请求映射过程分析

请求方式

Spring Boot支持Rest风格:使用HTTP请求方式的动词来表示对资源的操作

非Rest风格

以前这样写接口:

/getUser   获取用户
/deleteUser 删除用户
/updateUser  修改用户
/saveUser 保存用户
	@RequestMapping(value = "/getUser", method = RequestMethod.GET)
    public String getUser() {
        return "GET";
    }
    @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
    public String deleteUser() {
        return "POST";
    }
    @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
    public String updateUser() {
        return "POST";
    }
    @RequestMapping(value = "/saveUser", method = RequestMethod.POST)
    public String saveUser() {
        return "POST";
    }

使用Rest风格

使用Rest风格,则这样写接口:

 /user    GET-获取用户    DELETE-删除用户     PUT-修改用户      POST-保存用户
    @GetMapping("/user")
    public String getUser() {
        return "GET";
    }
    @PostMapping("/user")
    public String saveUser() {
        return "POST";
    }
    @PutMapping("/user")
    public String putUser() {
        return "PUT";
    }
    @DeleteMapping("/user")
    public String deleteUser() {
        return "DELETE";
    }

表单提交

通过表单方式提交请求,请求类型只能支持Get与Post

若表单提交要使用REST风格,则表单请求方式使用Post,添加隐藏域 _method=put、 _method=delete方式来支持Rest风格

示例如下:

<form action="/user" method="post">
	<input name="_method" type="hidden" value="delete"/>
    <input value="REST提交" type="submit"/>
</form>

SpringBoot配置文件中开启页面表单的Rest功能

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

过程分析

首先是从自动配置类WebMvcAutoConfiguration开始,其中的hiddenHttpMethodFilter方法入手,请求首先被该方法拦截

接着创建OrderedHiddenHttpMethodFilter对象,其又继承HiddenHttpMethodFilter

HiddenHttpMethodFilter中的doFilterInternal核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method

request.getParameter(this.methodParam)从请求中获取_method参数进行判断拦截,故可修改默认_method,自定义隐藏参数。

   @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        methodFilter.setMethodParam("_mymethod");
        return methodFilter;
    }

请求映射过程分析

首先一个请求肯定会经过HttpServlet类的doGet()doPost()等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:

推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet类的doGet()方法

processRequest方法又调用了doService方法

doService方法是一个接口,FrameworkServlet并没有具体实现

不过DispatcherServlet对其经行了具体实现,doService方法中又调用doDispatch核心请求分发方法

doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)

Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求

在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则

如下:某Controller层的/index请求方法就与RequestMappingHandlerMapping进行了关联绑定

接着再执行mapping.getHandler(request)

执行this.getHandlerInternal(request),来到AbstractHandlerMethodMapping类重写的方法

执行 super.getHandlerInternal(request);得到当前请求Path

执行this.lookupHandlerMethod(lookupPath, request);进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。

到此,Spring Boot的请求映射过程解析完毕。

最终,请求映射过程中涉及的类如下:

到此这篇关于Java Spring Boot请求方式与请求映射过程分析的文章就介绍到这了,更多相关Spring Boot请求映射内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Springboot使用put、delete请求报错405的处理
  • SpringBoot2之PUT请求接收不了参数的解决方案
  • springboot 中 inputStream 神秘消失之谜(终破)
  • SpringBoot中的PUT和Delete请求使用

java – 在Spring RESTful服务中使用相同的URL和相同的方法来使用不同的输入JSON格式

java – 在Spring RESTful服务中使用相同的URL和相同的方法来使用不同的输入JSON格式

我将使用Spring实现RESTful Web服务.
让它成为普通的PUT方法,如下所示:

@RequestMapping(method=RequestMethod.PUT,value="/foo")
public @ResponseBody void updateFoo(@RequestBody Foo foo) {
    fooService.update(foo);
}

在这种情况下,输入JSON格式(如果它对应于Foo类)将成功转换为Foo实例而不需要额外的努力,或者在格式错误的情况下将发出错误.
但我想使服务能够使用相同的方法(例如PUT)和相同的URL(例如/ foo)来使用两种不同类型的格式.

所以它可能看起来像:

//PUT method #1
@RequestMapping(method=RequestMethod.PUT,value="/foo")
public @ResponseBody void updateFoo(@RequestBody Foo foo) {
    fooService.update(foo);
}

//PUT method #2
@RequestMapping(method=RequestMethod.PUT,value="/foo")
public @ResponseBody void updateFoo(@RequestBody FooExtra fooExtra) {
    fooService.update(fooExtra);
}

Spring转换器尝试转换输入JSON,不仅在Foo中,而且在FooExtra中,并根据输入格式调用相应的PUT方法.

事实上,我试图完全按照上面描述的方式实现它,但没有成功.它甚至可能吗?也许,我需要某种“技巧”?
实现这种行为的最佳方式(也是最合适的方式)是什么?当然,我总是可以创建两个不同的URL,但我想知道是否可以使用相同的URL.

最佳答案
你的尝试不起作用只是因为Spring试图通过查看url和方法类型来匹配你的方法,这两种情况都是相同的.它不像Java中的重载那样工作;参数类型不区分您的方法.
但有好消息. SpringMVC还可以在尝试匹配处理程序方法时检查请求标头和请求参数.由于您要传递的内容实际上是纯元数据 – 相同信息的替代格式类型 – 因此使用自定义请求标头非常有意义.使用rest api时,添加自定义标头非常容易.请参阅以下链接了解JAX-RS:Adding a custom header.

现在在服务器端,您应该将处理程序方法配置为:

//PUT method #1
@RequestMapping(method=RequestMethod.PUT,value="/foo",headers="returnType=Foo")
public @ResponseBody Foo updateFoo(@RequestBody Foo foo) {
    fooService.update(foo);
}

//PUT method #2
@RequestMapping(method=RequestMethod.PUT,headers="returnType=FooExtra")
public @ResponseBody FooExtra updateFoo(@RequestBody FooExtra fooExtra) {
    fooService.update(fooExtra);
}

另请注意,如果要使用@ResponseBody访问返回值,则必须返回对象,否则使方法无效

今天关于Spring-可以在post方法的请求映射中提供相同的url吗?spring post请求的讲解已经结束,谢谢您的阅读,如果想了解更多关于ASP.NET Web API可以在与MVC相同的URL上工作吗?、HttpClient4.0 应用二 Post方法的URI获取、Java Spring Boot请求方式与请求映射过程分析、java – 在Spring RESTful服务中使用相同的URL和相同的方法来使用不同的输入JSON格式的相关知识,请在本站搜索。

本文标签: