当前位置: 首页 > 知识库问答 >
问题:

如何发出Post请求(从外部api获取JSON格式的数据)?

怀经赋
2023-03-14

如何使用POST方法将数据检索到数据库中,我创建了一个从外部服务api检索数据的方法-可以显示该方法,但我在创建将检索到的数据发送到数据库的适当方法时遇到了问题。

方法getCurrencyType从外部api检索数据:

@Component
public class CurrencyClient {

    public static final String URL_API_NBP = "http://api.nbp.pl/api/";
    private final RestTemplate restTemplate = new RestTemplate();

    public CurrencyModelDto getCurrencyType(String value) {
        CurrencyDto currencyDto = callGetMethod("exchangerates/rates/a/{currency}/", CurrencyDto.class, value);
        return CurrencyModelDto.builder()
                .code(currencyDto.getCode())
                .mid(currencyDto.getRates().stream().findFirst().get().getMid())
                .effectiveDate(currencyDto.getRates().stream().findFirst().get().getEffectiveDate())
                .build();
    }

    private <T> T callGetMethod(String url, Class<T> responseType, Object... objects) {
        return restTemplate.getForObject(URL_API_NBP + url,
                responseType, objects);
    }   
}

我准备了一个存储库和一个实体来创建一个数据库(创建了数据库,但没有填充数据)

@NoArgsConstructor
@Entity
@Getter
@Setter
public class Currency {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private float mid;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate effectiveDate;
}

我目前创建了一个POST方法addMONcy,但它不允许检索和保存数据(逻辑不好?)。

public class CurrencyController {

    private final CurrencyService currencyService

    @PostMapping
    public void addCurrency(@RequestBody CurrencyModelDto currencyModel) {
        Currency currency = new Currency();
        currency.setCode(currencyModel.getCode());
        currency.setMid(currencyModel.getMid());
        currency.setEffectiveDate(currencyModel.getEffectiveDate());
        currencyService.save(currency);
    }

}

DTO型号:

@Getter
@Builder
public class CurrencyModelDto {
    private String code;
    private float mid;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate effectiveDate;
}

允许您保存数据的服务。

@Service
@Slf4j
@RequiredArgsConstructor
public class CurrencyService {

    private final CurrencyRepository currencyRepository;

    public void save(Currency currency) {
        currencyRepository.save(currency);
    }
}

因此,我有一个问题,就是如何正确地创建一个POST方法,该方法将与getCurrencyType方法“交互”,并允许我保存从getCurrencyType方法检索的数据

共有1个答案

澹台臻
2023-03-14

你的控制器应该是这样的

import java.util.Objects;

@RestController
public class CurrencyController {

    private final CurrencyService currencyService;
    private final CurrencyClient currencyClient;

    public CurrencyController(CurrencyService currencyService, CurrencyClient currencyClient) {
        this.currencyService = currencyService;
        this.currencyClient = currencyClient;
    }

    @PostMapping(("/addCurrency/{value}"))
    public void addCurrency(@PathVariable String value) {
        CurrencyModelDto currencyModelDto = currencyClient.getCurrencyType(value);
        if (Objects.nonNull(currencyClient)) {
            Currency currency = new Currency();
            currency.setCode(currencyModelDto.getCode());
            currency.setMid(currencyModelDto.getMid());
            currency.setEffectiveDate(currencyModelDto.getEffectiveDate());
            currencyService.save(currency);
        }

    }

}

然后,如果您使用的是maven工具,请运行应用程序

$ mvn spring-boot:run

然后以这种方式使用您的Web服务

$ curl localhost:8080/addCurrency/EUR

注:欧元是欧元的货币名称

 类似资料:
  • 问题内容: data = { ‘ids’: [12, 3, 4, 5, 6 , …] } urllib2.urlopen("http://abc.com/api/posts/create”,urllib.urlencode(data)) 我想发送POST请求,但是其中一个字段应该是数字列表。我怎样才能做到这一点 ?(JSON?) 问题答案: 如果您的服务器期望POST请求为json,则您需要添加标

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我是Spring框架Java新手,我需要一种从我的应用程序调用外部Rest Api的方法。是否有任何“最佳实践”超文本传输协议客户端,以便我可以根据需要使用? 提前感谢

  • 我尝试做的是从同一个站点发布数据并从它创建一个新的订单(当提交按钮被点击时)。我没有任何信息在我的请求。身体,我怀疑是在我的ejs出了问题,任何反馈是非常感谢的。 我的ejs文件: 和我的js文件:

  • 我想要的是从一个API获取一个对象,并将HTTP(例如,jQuery的AJAX)请求发送到一个外部API。我该怎么开始?我对谷歌先生做了研究,但没有发现任何有用的东西。 我开始怀疑这是可能的吗?在这篇文章Laravel 4使后请求从控制器到外部url与数据它看起来像是可以做到的。但是没有例子也没有任何来源可以找到一些留档。 请帮帮我?

  • 问题内容: 如果尝试登录https://orbit.theplanet.com/Login.aspx?url=/Default.aspx(使用任何用户名/密码组合),则可以看到登录凭据以非传统集的形式发送POST数据:仅一个寂寞的JSON字符串,没有正常的key = value对。 具体来说,代替: 甚至类似: 简单来说就是: 是否可以使用或替代模块执行此类请求?我愿意这样做,但希望有更高层次的东

  • 客户端可能会发送多个查询参数,如: 我需要获取所有查询参数并将其提取为字符串