【问题标题】:How to pass Headers and request body in POST request?如何在 POST 请求中传递标头和请求正文?
【发布时间】:2020-05-11 08:00:24
【问题描述】:

我正在使用 RestTemplate restTemplate.exchangemethod 将请求发布到端点。我在不同的文件中有OAuth Header 和HttpEntity,我想将它们传递给POST 请求,除此之外,我还想将request 传递给端点。

我能够成功传递标头和请求,但不能传递包含凭据的 Http 实体

 ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST,
                new HttpEntity<>(request, dataRepo.getHeader()), String.class);

有什么方法可以让我通过所有 3 件事

  1. HttpEntity

  2. HttpHeaders

  3. 请求

这是我的代码

@RunWith(MockitoJUnitRunner.class)
@TestPropertySource
public class DataTest {
    @Inject
    private Oauth oauth;

    @Mock
    private DataRepo dataRepo;
    RestTemplate restTemplate = new RestTemplate();

    @Qualifier(OAuth2HttpHeadersBuilder.BEAN_NAME)
    NewHttpHeader headersBuilder;

    @Test
    public void testAddEmployeeSuccess() throws URISyntaxException {

        URI uri = new URI(url);
        Set<String> mockData = Stream.of("A","B").collect(Collectors.toSet());
        String onsString = String.join(",", mockData);

        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("name", onsString);
        JSONObject jsonObject = new JSONObject(requestBody);

        HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), null);

        ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST,
                new HttpEntity<>(request, dataRepo.getHeader()), String.class);

        Assert.assertEquals(201, result.getStatusCodeValue());
    }

以下代码在 NewHttpHeader.java 文件中,其中包含 Header 和 HttpEntity

     private HttpEntity<MultiValueMap<String,String>> getHttpEntity() {
            MultiValueMap<String, String> store = new LinkedMultiValueMap<>();
            store.add( "pas", "password" );
            store.add( "name", config.getVaultServiceAccountName() );
            return new HttpEntity<>( store, getHeader() );
        }


        private HttpHeaders getHeader() {
            HttpHeaders httpHeaders = headersBuilder.build();

            httpHeaders.add( HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.getMimeType() );
            httpHeaders.add( HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_FORM_URLENCODED.getMimeType() );

            return httpHeaders;
        }
    }

【问题讨论】:

  • 为什么要告诉我们NewHttpHeader.java? testAddEmployeeSuccess() 方法不使用它。
  • 这是 DataRepo 的测试文件,其中注入了 NewHttpHeader 方法,因此我可以在测试文件中访问它们

标签: java spring post resttemplate


【解决方案1】:

引用问题:

有什么方法可以让我通过所有 3 件事

  1. HttpEntity
  2. HttpHeaders
  3. 请求

引用HttpEntity的javadoc:

表示一个 HTTP request 或响应实体,由 headers 和 body 组成。

所以你的问题的答案是:是的,你可以通过所有 3 个,因为第一个只不过是其他两个的组合。

只需合并您的两个 HttpEntity 对象。

之前

HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), null);

ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST,
        new HttpEntity<>(request, dataRepo.getHeader()), String.class);

之后

HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), dataRepo.getHeader());

ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST,
        request, String.class);

【讨论】:

  • 我试过了,但它不起作用,我仍然收到 401 未经授权的帖子请求。另外,如果我调用 getHttpEntity,那么我不需要调用来获取 httpHeaders,那么有什么办法可以用 gethttpentity 替换 gethttpheaders 吗?谢谢
  • 这可能是因为你的标题是错误的。由于我们不知道您发送的标头是什么,而且我们不知道服务器需要什么来对您进行身份验证,因此我们无法提供真正的帮助。
  • 好的,我可以调查一下,但是合并 HttpEntity 是否意味着 getHttpEntity() 和 requestBody(这是 JSON 数据)中存在的凭据必须合并为单个 HttpEntity?如果是,那么这是一个好方法吗?
  • HttpEntity构造函数的第一个参数指定POST请求的body。一个请求只能有一个主体,因此有一个带有实际有效负载 (jsonObject) 的 POST 请求,它也应该在 same 请求主体中具有用户/密码,这使得没有感觉,在所有。身份验证需要 单独 请求以“登录”到服务器,然后将一些值转发给下一个请求,例如一个 cookie, 或 它要求在标头中包含身份验证值。退后一步,从头开始重新评估您应该在这里做什么。
  • 以上代码是单元测试,在使用交换进行 POST 时会抛出 401 未经授权的错误。所以我认为标题可能有问题。我正在使用localhost:3000/project/messager,这是我发出发布请求的实际端点。无论如何我可以将模拟发布到端点或使用模拟端点。这样我的测试就成功了,状态码 401 不再是问题。如果是,您能否就如何进行提供一些建议?谢谢
猜你喜欢
  • 2020-12-23
  • 2021-05-31
  • 2017-11-20
  • 2015-02-18
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多