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
用流写文件文件不可读,其他有些资源是可以的,很奇怪!
你的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 错误的问题!