使用Spring进行简单的REST API调用?

3

我现在有一个简单的REST API正在运行。我还有一个移动应用程序(Android),可以准备进行一些网络通信。但问题在于:

我现在使用 Spring 创建了一个花哨的API,可以使用Http-Requests:

package com.helloworld

@Controller
@RequestMapping("/helloWorld")
public class HelloWorldController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello(ModelMap model) {
        model.addAttribute("msg", "JCG Hello World!");
        return "helloWorld";
    }
}

这都很好,但我该如何在我的Android移动应用程序中使用此API?我的意思是,我不知道如何更优雅和简单地进行这些调用!我不想为每个API请求编写像这样的内容:

class HelloWorldTask extends AsyncTask<String, String, String> {

    private String url = "http://192.168.42.229:8080/HelloWorldExample/helloWorld/displayMessage/" + msg; 

    @Override
    protected String doInBackground(String... uri) {

        String msg = "";
        for(String m : uri) { msg += m; }    

        RestTemplate restTemplate = new RestTemplate();    
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
        return restTemplate.getForObject(url, String.class, "Android");
    }
}

有没有什么方法可以避免这种情况?说实话,我曾经相信在构建REST API项目后只需导入类似于helloworld-api.jar的东西,然后像这样做:

import com.helloworld

public void getServerHello() {

    HelloWorldController api;

    HelloWorld helloWorld = api.getHelloWorldMapping();
    helloWorld.displayMessage("How are you?");
}

这将是最终结果。在编写Spring REST API时,是否有一种方法可以像这样做,还是我真的必须使用类似于URI构建器的东西,并自己创建所有类型请求的附加“class Task extends AsyncTask”?由于API已经明确定义,应该可以做到这一点,但真的吗?希望我的问题很清楚-如果不清楚,请告诉我。

1
你能澄清一下你的例子吗?getServerHello() 不太适合映射到控制器。getHelloWorldMapping() 和 displayMessage() 应该做什么?此外,你是否意识到 REST 是基于资源的 API(即不是 RPC)?我感觉 SOAP 可能更适合你的需求... - qbd
@qbd 这应该是一个简单的伪代码示例,但 displayMessage() 应该基本上只是运行类似于 HelloWorldTask.execute() 的东西。我不想自己编写这个,因为我认为应该有一种从定义良好的 REST API 中提取“客户端接口库”之类的方式,以便我可以轻松使用。对于我的用例:我需要一个处理移动应用程序客户端并提供 Web 接口的服务器。我不知道 REST 是否真的是我最好的选择,但它是否错误? - Stefan Falk
5个回答

1
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;

import com.itech.payroll.dto.ComypanyDTO;
import com.itech.payroll.dto.EmployeeDTO;
import com.itech.payroll.dto.User;
import com.itech.payroll.repo.PayrollRepo;
import com.itech.payroll.service.PayrollService;
import com.itech.payroll.service.UserService;
/**
 * REST API Implementation Using REST Controller
 * */
@RestController
public class RestReqCntrl {

    @Autowired
    private UserService userService;    

    @Autowired
    private PayrollService payrollService;  


    //-------------------Create a User--------------------------------------------------------

    @RequestMapping(value = "/registerUser", method = RequestMethod.POST)
    public ResponseEntity<User> registerUser(@RequestBody User user,    UriComponentsBuilder ucBuilder) throws Exception {
        System.out.println("Creating User " + user.getFirstName());

        boolean flag = userService.registerUser(user);

         if (flag)
         {
             user.setStatusCode(1);
             user.setStatusDesc("PASS");
         }else{
             user.setStatusCode(0);
             user.setStatusDesc("FAIL");

         }

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/registerUser").buildAndExpand(user.getId()).toUri());
        return new ResponseEntity<User>(user,headers, HttpStatus.CREATED);
    }   

    //-------------------Authenticating the User--------------------------------------------------------

    @RequestMapping(value = "/authuser", method = RequestMethod.POST)
    public ResponseEntity<User> authuser(@RequestBody User user,UriComponentsBuilder ucBuilder) throws Exception {
        System.out.println("Creating User " + user.getFirstName());

        boolean flag = userService.authUser(user);

         if (flag)
         {
             user.setStatusCode(1);
             user.setStatusDesc("PASS");
         }else{
             user.setStatusCode(0);
             user.setStatusDesc("FAIL");

         }

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/authuser").buildAndExpand(user.getFirstName()).toUri());
        return new ResponseEntity<User>(user,headers, HttpStatus.ACCEPTED);
    }   

    //-------------------Create a Company--------------------------------------------------------
    @RequestMapping(value = "/registerCompany", method = RequestMethod.POST)
    public ResponseEntity<String> registerCompany(@RequestBody ComypanyDTO comypanyDTO, UriComponentsBuilder ucBuilder) throws Exception {
        System.out.println("Creating comypanyDTO " + comypanyDTO.getCmpName());
        String result ="";
        boolean flag = payrollService.registerCompany(comypanyDTO);

         if (flag)
         {
             result="Pass";
         }else{
             result="Fail";

         }

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/registerCompany").buildAndExpand(result).toUri());
        return new ResponseEntity<String>(result,headers, HttpStatus.ACCEPTED);
    }   


    //-------------------Create a Employee--------------------------------------------------------
    @RequestMapping(value = "/registerEmployee", method = RequestMethod.POST)
    public ResponseEntity<String> registerEmployee(@RequestBody EmployeeDTO employeeDTO, UriComponentsBuilder ucBuilder) throws Exception {
        System.out.println("Creating registerCompany " + employeeDTO.getEmpCode());
        String result ="";
        boolean flag = payrollService.registerEmpbyComp(employeeDTO);

         if (flag)
         {
             result="Pass";
         }else{
             result="Fail";

         }

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/registerCompany").buildAndExpand(result).toUri());
        return new ResponseEntity<String>(result,headers, HttpStatus.ACCEPTED);
    }   

    //-------------------Get Company Deatils--------------------------------------------------------
    @RequestMapping(value = "/getCompanies", method = RequestMethod.GET)
    public ResponseEntity<List<ComypanyDTO> > getCompanies(UriComponentsBuilder ucBuilder) throws Exception {
        System.out.println("getCompanies getCompanies ");
        List<ComypanyDTO> comypanyDTOs =null;
        comypanyDTOs = payrollService.getCompanies();
        //Setting the Respective Employees
        for(ComypanyDTO dto :comypanyDTOs){

            dto.setEmployeeDTOs(payrollService.getEmployes(dto.getCompanyId()));
        }

        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(ucBuilder.path("/registerCompany").buildAndExpand("LISt").toUri());
        return new ResponseEntity<List<ComypanyDTO>>(comypanyDTOs,headers, HttpStatus.ACCEPTED);
    }   

}

jackson-annotations-2.5.0.jar,jackson-core-2.5.3.jar,jackson-databind-2.5.3.jar 这些 jar 文件需要被导入。 - Raj Sharma
感谢您详细的回答。您能稍微解释一下您的代码吗? - TayTay

0

在你的方法上加上@ResponseBody注解

@Controller
@RequestMapping("/helloWorld")
public class HelloWorldController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces="application/json")
    @ResponseBody
    public String hello(ModelMap model) {
        model.addAttribute("msg", "JCG Hello World!");
        return "helloWorld";
    }
}

如果方法被注释为@ResponseBody,则返回类型将写入响应HTTP正文。上面的示例将导致文本helloWorld被写入HTTP响应流。
编写一个Http Android客户端,向您的Spring应用程序发送Http请求,响应将以JSON格式返回。通过Jquery解析JSON并显示数据。

0
编写 API 需要遵循以下模式:

package com.helloworld

@Controller
@RequestMapping("/api")
public class HelloWorldController {
    @ResponseBody
    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    public String hello() {
        return "helloWorld";
    }
}

如果您想进行更详细的逐步学习,可以关注链接


0
在我的当前项目中,我们有一个类似的设置,使用Java客户端和基于Spring REST API的RESTful后端。我们使用apache-cxf-rs-client-api从客户端调用我们的REST服务。
  1. 为您的HelloWorldController方法创建一个接口。

  2. apache-cxf-rs-client-api添加到您的项目中(查看更多信息)。

  3. 现在您可以在客户端上调用接口,Apache CXF会为您完成其余工作。


看起来不错,也很有用。我要拿走了 :) - Stefan Falk

0

请查看 Volley 或 Retrofit。后者特别适用于快速设置客户端 API 调用。

当我做类似这样的事情时,通常会重复使用服务器模型(例如当我同时为客户端和服务器编写代码时)。

否则,您可以将 JSON 转换为 POJO 类,并将其与 Retrofit 一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接