GVKun编程网logo

如何从RestTemplate调用中提取HTTP状态代码到URL?(resttemplate获取response)

15

在本文中,我们将给您介绍关于如何从RestTemplate调用中提取HTTP状态代码到URL?的详细内容,并且为您解答resttemplate获取response的相关问题,此外,我们还将为您提供关于

在本文中,我们将给您介绍关于如何从RestTemplate调用中提取HTTP状态代码到URL?的详细内容,并且为您解答resttemplate获取response的相关问题,此外,我们还将为您提供关于angularjs – 如何从$resource请求获取Http状态代码、httpClient 和 RestTemplate 的使用、http调用之RestTemplate、io.restassured.internal.http.HttpResponseException 测试 http 状态代码时的知识。

本文目录一览:

如何从RestTemplate调用中提取HTTP状态代码到URL?(resttemplate获取response)

如何从RestTemplate调用中提取HTTP状态代码到URL?(resttemplate获取response)

我正在使用RestTemplateHTTP调用我们的服务,该服务返回一个简单的JSON响应。我根本不需要解析该JSON。我只需要退还从该服务中获得的收益。

所以我将其映射到String.classJSON response以字符串形式返回实际值。

RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url, String.class);return response;

现在的问题是-

我想HTTP Status codes在点击URL后提取。如何从上述代码中提取HTTP状态代码?我是否需要以目前的方式对此进行任何更改?

更新:-

这是我尝试过的方法,我也可以获取响应和状态代码。但是我是否总是需要像下面这样设置HttpHeadersEntity反对呢?

    RestTemplate restTemplate = new RestTemplate();    //and do I need this JSON media type for my use case?    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON);    //set my entity    HttpEntity<Object> entity = new HttpEntity<Object>(headers);    ResponseEntity<String> out = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);    System.out.println(out.getBody());    System.out.println(out.getStatusCode());

几个问题-
我需要做什么,MediaType.APPLICATION_JSON因为我只是对url进行调用,它返回了响应,它可以返回JSON或XML或简单字符串。

答案1

小编典典

使用RestTemplate#exchange(..)返回的方法ResponseEntity。这使您可以访问状态行和标题(显然还有正文)。

angularjs – 如何从$resource请求获取Http状态代码

angularjs – 如何从$resource请求获取Http状态代码

您好我是AngularJS的新手.我想从此请求中获取状态代码.这是我的代码:

angular.module('myApp',['ngResource']);
angular.module('myApp').controller('myCtrl',function ($scope,UserService) {

 UserService.save({name:'Sahar',email:'abc.abc@yahoo.com'}).$promise

       .then(function (response) {
        console.log('Error status: ' + response.status);
        return response;
    });

});
angular.module('myApp')
    .factory('UserService',function ($resource) {
        return $resource('http://jsonplaceholder.typicode.com/users/:user',{user:'@user'});
    });

解决方法

只需使用“transformResponse”

return $resource('http://jsonplaceholder.typicode.com/users/:user',user:'@user',{
    query: {
        method: 'GET',transformResponse: function (data,headers,status) {
            var ret = {data: data,status: status};
            return ret;
        }}

});

您将在{status}键和{status}键中获取{data}键和“Status Code”(例如200,500,403)中的数据

httpClient 和 RestTemplate 的使用

httpClient 和 RestTemplate 的使用

1、httpClient 的使用

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.5</version>
</dependency>

 

// 第一步:创建一个httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();

// 第二步:创建一个HttpPost对象。需要指定一个url
// HttpPost post = new HttpPost("http://47.244.48.xxx/xxx/xxx/");
HttpPost post = new HttpPost("http://127.0.0.1:8080/xxx/xxx/");

// 携带cookie
String sessionId = "PHPSESSID=KSoxfJlB20JJ0...";
BasicHeader header = new BasicHeader("Cookie", sessionId);
post.setHeader(header);

// 第三步:创建一个list模拟表单,list中每个元素是一个NameValuePair对象
List<NameValuePair> formList = new ArrayList<>();
formList.add(new BasicNameValuePair("xxx", "xxx"));
formList.add(new BasicNameValuePair("xxx", "xxx"));

// 第四步:需要把表单数据包装到Entity对象中: StringEntity
StringEntity entity = new UrlEncodedFormEntity(formList, "utf-8");
post.setEntity(entity);

// 第五步:执行请求。
CloseableHttpResponse response = httpClient.execute(post);

// 第六步:接收返回结果
HttpEntity httpEntity = response.getEntity();
String result = EntityUtils.toString(httpEntity);
System.out.println(result);

// 第七步:关闭流。
response.close();
httpClient.close();

 

2、RestTemplate 的使用:get 请求带 Cookie

String url = Config.XXX_BASE_URL + "/userlevel?inviterId=" + invit1;
String restInfo = MessageFormat.format("url:{0}, inviterId:{1}", url, invit1);
UtilFunctions.log.info("UserController#register call rest api info, " + restInfo);

HttpHeaders requestHeaders = new HttpHeaders();
List<String> cookieList = UtilFunctions.getCookieList(request);
requestHeaders.put("Cookie", cookieList);
HttpEntity<String> requestEntity = new HttpEntity<String>(null, requestHeaders);
restTemplate.exchange(url, HttpMethod.GET, requestEntity, JSONObject.class).getBody();

   

  UtilFunctions 类的 getCookieList () 方法

public static List<String> getCookieList(HttpServletRequest request) {
    List<String> cookieList = new ArrayList<>();
    
    Cookie[] cookies = request.getCookies();
    if (cookies == null || cookies.length == 0) {
        return cookieList;
    }

    for (Cookie cookie : cookies) {
        cookieList.add(cookie.getName() + "=" + cookie.getValue());
    }
    
    return cookieList;
}

 

 

参考资料:

  1)Springboot — 用更优雅的方式发 HTTP 请求 (RestTemplate 详解)

 

http调用之RestTemplate

http调用之RestTemplate

核心方法为org.springframework.web.client.RestTemplate.doExecute(URI, HttpMethod, RequestCallback, ResponseExtractor<T>)

方法内容如下:

 

 其中,重点在下面这三行

 

 ClientHttpRequest是http请求调用的抽象,具体实现有jdk自带的以及apache的httpclient,实现类如下:

 

simple开头的是使用jdk自带的net操作,Components的底层是httpclient操作。

 AbstractBufferingClientHttpRequest为缓存requestbody的基类,内部bufferedOutput保存了requestbody的内容,避免流的二次读取会导致读取不到数据。

那么,到底是哪里给这个ByteArrayOutputStream对象赋值的呢?答案就在org.springframework.web.client.RestTemplate.HttpEntityRequestCallback,注释讲得很清楚:

 

 在上面讲到的重点强调的三行代码中,调用了org.springframework.web.client.RestTemplate.HttpEntityRequestCallback.doWithRequest(ClientHttpRequest)方法,这个方法里面根据requestContentType等信息,在HttpMessageConverters列表中寻找合适的HttpMessageConverter,利用这些httpMessageConverter天然的write方法将requestBody的内容经过处理转换写入入参HttpOutputMessage对应的getBody方法返回的OutputStream流中。然而,我们这里的ClientHttpRequest接口继承自HttpOutputMessage,AbstractClientHttpRequest的getBody实现调用子类的getBodyInternal方法,重点来了,AbstractBufferingClientHttpRequest的getBodyInternal返回的就是bufferedOutput,也就是缓存的ByteArrayOutputStream。到这里,缓存的requestbody数据有了。再啰嗦一句,使用HttpEntityRequestCallback的都是post请求的,get请求用的AcceptHeaderRequestCallback。

那么,问题来了,什么情况下会用这个缓存数据呢?我们看下AbstractBufferingClientHttpRequest的子类就知道了。

这里,又要回到刚刚的三行重点代码,doExecute的时候调用createRequest方法返回ClientHttpRequest,实际调用父类方法org.springframework.http.client.support.HttpAccessor.createRequest(URI, HttpMethod):

 

 

 org.springframework.http.client.support.InterceptingHttpAccessor.getRequestFactory()方法如下:

 

 

 如果设置了拦截器就返回InterceptingClientHttpRequestFactory,并将restTemplete原有的RequestFactory作为参数传入。

该factory创建的是org.springframework.http.client.InterceptingClientHttpRequest,该类重写的executeInternal方法通过内部类InterceptingRequestExecution实现interceptors顺序执行,当迭代结束后,通过之前传进来的requestFactory创建ClientHttpRequest,并将body copy给刚刚创建的request的body,并调用execute方法,方法内容如下:

其实,InterceptingClientHttpRequest本身就带有requestbody缓存copy功能,所以无需在创建restTemplate时包装一个BufferingClientHttpRequestFactory,直接使用HttpComponentsClientHttpRequestFactory即可,这个factory自带bufferRequestBody功能。

相信大部分同学在项目中都是选择apache的httpclient发送http请求,所以,这里我们重点看下org.springframework.http.client.HttpComponentsClientHttpRequestFactory,我们看下createRequest方法:

public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
        HttpClient client = getHttpClient();

        HttpUriRequest httpRequest = createHttpUriRequest(httpMethod, uri);
        postProcessHttpRequest(httpRequest);
        HttpContext context = createHttpContext(httpMethod, uri);
        if (context == null) {
            context = HttpClientContext.create();
        }

        // Request configuration not set in the context
        if (context.getAttribute(HttpClientContext.REQUEST_CONFIG) == null) {
            // Use request configuration given by the user, when available
            RequestConfig config = null;
            if (httpRequest instanceof Configurable) {
                config = ((Configurable) httpRequest).getConfig();
            }
            if (config == null) {
                config = createRequestConfig(client);
            }
            if (config != null) {
                context.setAttribute(HttpClientContext.REQUEST_CONFIG, config);
            }
        }
     // 默认情况下bufferRequestBody为true,创建使用缓存的body作为请求体
        if (this.bufferRequestBody) {
            return new HttpComponentsClientHttpRequest(client, httpRequest, context);
        }
        else {
            return new HttpComponentsStreamingClientHttpRequest(client, httpRequest, context);
        }
    }

看下上面注释的类的下面方法org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpHeaders, byte[]):

 

 

 这个类也是继承自AbstractBufferingClientHttpRequest,所以刚刚InterceptingRequestExecution迭代结束后getBody返回的就是缓存的bufferedOutput,到这里执行的时候就将bufferedOutput作为ByteArrayEntity发送http请求。至此,结束。

 

io.restassured.internal.http.HttpResponseException 测试 http 状态代码时

io.restassured.internal.http.HttpResponseException 测试 http 状态代码时

如何解决io.restassured.internal.http.HttpResponseException 测试 http 状态代码时?

我想使用 Java Serenity、Cucumber 和 Rest Assured (SerenityRest) 测试 API。我在以下位置导入项目:https://github.com/jacekzygiel/SerenityRestAssured 并且我想测试 HTTP 状态代码,例如 400、401、404 等。

但是当我尝试调用端点来测试这些状态代码时,它抛出异常并导致测试失败并出现错误,尽管有测试这些状态代码的场景。

我只是复制了完整的源代码,没有做任何更改,但仍然出现错误

Caused by: io.restassured.internal.http.HttpResponseException: Bad Request
    at io.restassured.internal.http.HTTPBuilder.defaultFailureHandler(HTTPBuilder.java:626)

如何防止它给出异常并让响应继续其他步骤来断言错误响应?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

我们今天的关于如何从RestTemplate调用中提取HTTP状态代码到URL?resttemplate获取response的分享已经告一段落,感谢您的关注,如果您想了解更多关于angularjs – 如何从$resource请求获取Http状态代码、httpClient 和 RestTemplate 的使用、http调用之RestTemplate、io.restassured.internal.http.HttpResponseException 测试 http 状态代码时的相关信息,请在本站查询。

本文标签: