httpclient 返回content-length 错误的问题!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpclient 返回content-length 错误的问题!相关的知识,希望对你有一定的参考价值。

httpclient 返回content-length 错误的问题!

访问一个javaeye图片资源,

content-length明明有8702

但是用httpclient 返回的值只有2500多

public final class HttpClientUtil
private static Logger LOG = LoggerFactory.getLogger(HttpClientUtil.class);

public static void main(String[] args) throws Exception
// System.out
// .println(getInputStream("http://www.javaeye.com/upload/logo/user/366181/1b8c56ad-8f75-3f2b-99d6-7d82e7fa9b57.gif?1292213442"));
InputStream backgroundIn = getInputStream("http://www.javaeye.com/upload/logo/user/366181/1b8c56ad-8f75-3f2b-99d6-7d82e7fa9b57.gif");

File backgroundF = new File("/home/alimail/test123.jpg");
if (!backgroundF.exists())
backgroundF.createNewFile();


FileOutputStream fos = new FileOutputStream(backgroundF);
if (backgroundIn != null)
byte[] bs = new byte[1024];
int writeNum = 0;
int total = 0;
try
while ((writeNum = backgroundIn.read(bs)) != -1)
total += writeNum;
if (writeNum == 1024)
fos.write(bs);
else
byte[] bs1 = new byte[writeNum];
System.arraycopy(bs, 0, bs1, 0, writeNum);
fos.write(bs1);



System.out.println(total);
catch (IOException e)
LOG.error(e.getMessage(), e);




public static String get(String url)
HttpClient httpClient = new HttpClient();

GetMethod getMethod = new GetMethod(url);
String response = "";
try
int statusCode = httpClient.executeMethod(getMethod);
response = getMethod.getResponseBodyAsString();

LOG.info("Http status:" + statusCode);
catch (HttpException e)
catch (IOException e)
finally


return response;


public static InputStream getInputStream(String url) throws IOException
HttpClient httpClient = new HttpClient();

GetMethod getMethod = new GetMethod(url);
try
int statusCode = httpClient.executeMethod(getMethod);
LOG.info("Http status:" + statusCode);

System.out.println("Http status:" + statusCode);
for (Header h : getMethod.getResponseHeaders())
System.out.println(h.getName() + ":" + h.getValue());
catch (HttpException e)
catch (IOException eContentLength)
finally


return getMethod.getResponseBodyAsStream();


public static String post(String url)

return null;




Http status:200
Content-Length:2095
用流写文件文件不可读,其他有些资源是可以的,很奇怪!

http通信,头信息返回的content-length只不过是一个相对的数值,并不保证绝对准确。
你的httpclient代码 只是输出从服务器头信息接收的值,并不代表实际下载文件的值。

---------------------------

必须输出文件的流关闭,参能读取。
参考技术A 去360论坛问,很快的 ,注意分类。。。。。 参考技术B 发啊

如何将 HttpClient 订阅数据返回给组件

【中文标题】如何将 HttpClient 订阅数据返回给组件【英文标题】:How to return HttpClient subscribe data to a component 【发布时间】:2018-03-30 05:34:24 【问题描述】:

我正在尝试使用订阅方法从服务返回数据。

import  Injectable  from '@angular/core';
import  HttpClient  from '@angular/common/http';

@Injectable()
export class DevRequestService 
    constructor(private http: HttpClient)
    getListOfAgencies() 
        return this.http.get('https://example.com/api/agency').subscribe(data => 
            return data;
          );
    

组件:

ngOnInit(): void 
  console.log(this.devRequestService.getListOfAgencies());

下面是我在 console.log 中得到的输出,而不是返回带有值的对象:

Subscriber closed: false, _parent: null, _parents: null, _subscriptions: Array(1), syncErrorValue: null, …

【问题讨论】:

没错,您正在获得订阅者。这就是Observable.subscribe 返回的内容,这就是您要返回的内容。可能您想要的是return this.http.get(...),并将订阅移动到组件中。或者,您可以通过另一个 observable 公开获取的数据,正如我在这里所写的:blog.jonrshar.pe/2017/Apr/09/async-angular-data.html 【参考方案1】:

我也遇到了这个问题,我没有得到响应,而是一个订阅者实例。事实证明,服务器代码没有返回 JSON 可解析响应。似乎是一个无声的错误,不知道为什么。但是当我修复服务器代码以返回一个对象时,我得到了响应。

【讨论】:

【参考方案2】:

如果你想加载数据来查看,你应该在你的服务中使用新的主题。例如:

export class PostService 
    subject = new Subject();
    constructor(private httpClient: HttpClient) 

    const httpRequest = new HttpRequest(
        'GET',
        '/your-url',
        body,
        
            headers: new HttpHeaders().set('Content-Type', 'body'),
        
    );
    this.httpClient.request(httpRequest).subscribe((res) => 
        if (res.type) 
            this.subject.next(res.body);
        
    );

    return this.subject;

在组件中:

export class PostsComponent implements OnInit 
    posts: any;
    constructor(private postService: PostService)  

    ngOnInit() 
        this.getPosts();
    

    private getPosts() 
        this.posts = this.postService.getPosts();
    

在视图中:

<app-post-item
    class="col-md-4"
    *ngFor="let post of posts | async"
    [post]="post">
</app-post-item>

【讨论】:

【参考方案3】:

您应该订阅数据并将其分配给组件中的变量,如下所示:

ngOnInit(): void 
   this.devRequestService.getListOfAgencies().subscribe((data) => 
      this.agencies = data;
   )
;

【讨论】:

【参考方案4】:

我会在您的 .ts 中执行此操作: 私有数据$:可观察;

ngOnInit(): void 
    this.data$ = this.devRequestService.getListOfAgencies();

在你的 .html 模板中,这个:

<div>  data$ | async  </div>

为了得到价值。

【讨论】:

以上是关于httpclient 返回content-length 错误的问题!的主要内容,如果未能解决你的问题,请参考以下文章

httpclient 返回content-length 错误的问题!

深入理解HttpClient

HttpClient 不报告从 Web API 返回的异常

HTTPClient 返回 HttpRequestException WinRT

HttpClient 返回 404 未找到

HttpClient 和 WebClient 返回 503 服务器不可用或 403 禁止