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

如何将带有HTTP基本身份验证的curl请求转换为Spring RestTemplate请求?

夹谷奇
2023-03-14
curl -u 751061:123456 -i -k -X PUT https://server/api/User/751061 -H 'Content-type: application/xml' -d '<User><state>LOGIN</state><extension>751055</extension></User>'

我试着遵循指南,但它根本没有提到任何关于身份验证(也没有XML)的内容。

https://spring.io/guides/gs/consource-rest/#_make_the_application_executable

@PostMapping("/login")
public String login(@RequestParam(name="userId", required=true) String userId,
        @RequestParam(name="password", required=true) String password,
        @RequestParam(name="extension", required=true) String extension,
        HttpSession session,
        RestTemplateBuilder builder) {
    User user = new User();
    user.state = "LOGIN";
    user.extension = extension;
//      RestTemplate restTemplate = new RestTemplate();
//      restTemplate.set
    RestTemplate restTemplate = builder.basicAuthorization(userId, password).build();
    restTemplate.put("https://server/api/User/"+userId, user);
2018-09-14 22:19:44.038 ERROR 143068 --- [nio-8443-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.client.RestTemplateBuilder]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Customizers must not be null] with root cause

java.lang.IllegalArgumentException: Customizers must not be null
        at org.springframework.util.Assert.notNull(Assert.java:193) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.boot.web.client.RestTemplateBuilder.<init>(RestTemplateBuilder.java:104) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_152]
public String login(@RequestParam(name="userId", required=true) String userId,
        @RequestParam(name="password", required=true) String password,
        @RequestParam(name="extension", required=true) String extension,
        HttpSession session
        /*RestTemplateBuilder builder*/) throws KeyManagementException, NoSuchAlgorithmException {
    User user = new User();
    user.state = "LOGIN";
    user.extension = extension;

    // turn off SSL checking // https://stackoverflow.com/a/24491820/148844
    X509TrustManager[] tm = new X509TrustManager[] {new TrustAllX509TrustManager()}; // from IdS client SDK
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init( null, tm, null );
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // set authentication headers
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_XML);
    String plainClientCredentials = userId + ":" + password;
    String base64ClientCredentials = new String(Base64.encodeBase64(plainClientCredentials.getBytes()));
    headers.add("Authorization", "Basic " + base64ClientCredentials);
    HttpEntity request = new HttpEntity(null, headers);
    // make request
    RestTemplate restTemplate = new RestTemplate();
    String url = "https://server/api/User/"+userId;
    restTemplate.put(url, request, user);
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
        at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
        at org.springframework.web.client.RestTemplate.put(RestTemplate.java:495) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
restTemplate.setErrorHandler(new ResponseErrorHandler() {

    @Override
    public void handleError(ClientHttpResponse arg0) throws IOException {
        byte[] b = new byte[arg0.getBody().available()];
        arg0.getBody().read(b);
        System.out.println(new String(b));
    }

    @Override
    public boolean hasError(ClientHttpResponse arg0) throws IOException {
        return arg0.getRawStatusCode() != 202;
    }

});
System.out.println("\n\n\n********************************************************************");
restTemplate.put(url, request, user);
********************************************************************
<ApiErrors>
  <ApiError>
    <ErrorType>Invalid Input</ErrorType>
    <ErrorData>User</ErrorData>
    <ErrorMessage> : Premature end of file.</ErrorMessage>
  </ApiError>
</ApiErrors>

共有1个答案

东门修文
2023-03-14
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("username", "password"));
 类似资料:
  • 问题内容: 我必须 使用 HTTP Basic身份验证从http服务器下载和解析XML文件。现在,我这样做: 但是以这种方式,我无法从具有http身份验证的服务器获取xml(或者我只是根本不知道该文档)文档。 如果您能向我展示实现我的目标的最好,最简单的方法,我将不胜感激。 问题答案: 您可以使用。例如: 这将设置默认值,并将在 所有 请求中使用。显然,当您不需要所有请求的凭据或多个不同的凭据(可

  • 问题内容: 我有以下CURL请求,谁能请我确认subesquest HTTP请求是什么? 会是这样吗? 任何人都可以帮助我将上述curl请求完全转换为httpreq。 提前致谢。 苏维 问题答案: 有很多方法可以实现这一目标。在我看来,以下一项是最简单的,同意它不是很灵活,但是可以工作。

  • 我正在尝试向正在运行的本地服务器发出GET请求。我无法返回正确的数据,我看到“未经授权”的响应。如果字符串“token”是正确的,那么任何人都能发现任何明显的问题吗。 }* 我能够从命令行获得一个curl请求:

  • 问题内容: 我有一个具有基本身份验证的RESTFull服务,我想从iOS + swift调用它。我必须如何以及在何处为此请求提供凭据? 我的代码(对不起,我刚刚开始学习iOS / obj-c / swift): } 问题答案: 您需要在实例中提供凭据,例如Swift 3: 或在Swift 2中:

  • 我需要对以下URL执行请求: http://[USERNAME]:[PASSWORD]@[SERVER_IP]:[PORT]/some/path/to/some/file 但是最终生成的URL被视为无效,因为它包含两次:字符。有什么解决办法吗? 这就是我所尝试的:

  • 问题内容: 我正在尝试将API查询输入python。命令行 提供一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python进行此调用,以便我可以遍历不同的id并分析输出。有任何想法吗?在需要身份验证之前,我已经使用urllib2进行了此操作。我也查看了请求模块,但无法弄清楚该怎么做。 非常感谢。 问题答案: 该请求包有一个用于HTTP请求的一个非常好的API,加入了自定义