当前位置: 代码迷 >> python >> 编写一个小而灵活的HTTP客户端
  详细解决方案

编写一个小而灵活的HTTP客户端

热度:43   发布时间:2023-06-13 16:57:01.0

我正在寻找人们如何编写一个快速(小)但灵活的HTTP客户端。 快速我的意思是代码不多,(我将由你来决定这意味着什么),并且最好使用内置语言函数而不是下载或自定义库,这样套接字编程的基本知识应该是足以理解代码的工作原理。 灵活的我的意思是你应该能够轻松地操纵传入的数据。 我自己的版本就是这样的

#!/usr/bin/perl
use Socket;
use HTML::Parse;

socket(SOCKH, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die $!;
connect(SOCKH,sockaddr_in(80,inet_aton('www.example.com'))) || die $!;

$old_fh = select(SOCKH);
$|=1;
select($old_fh);

print SOCKH "GET / HTTP/1.0\n\n";

while (<SOCKH>) {
    $response .= $_;
}

print parse_html($response)->format;

close(<SOCKH>);

这只是一个快速的客户端,我很快就会为HTTP / 1.1进行编辑,或者如果您有关于如何提高合规性的建议请分享!

编辑:我的代码更新,使用LWP作为Sinan Unur建议:

#!/usr/bin/perl
use LWP::Simple;
use HTML::Parse;

$data = parse_html( get( 'www.example.com' ) )->format;
foreach $line ( $data ) {
    print $line; // or any other line-based operation
}

Perl有 。 我建议你用它。

类似于@Santa的例子,仅在Ruby中:

require 'open-uri'
print open('http://www.example.com').read

如果你想解析内容,Ruby的宝石很棒。 它建立在libXML之上。

许多其他HTTP客户端宝石都可用,包括和 。 HTTParty使得向类添加REST功能以及解析JSON和XML的能力变得微不足道。 Typhoeus可以轻松地同时为并行获取/头/ whatevers写入多个请求。

Python有“电池包含”

您不需要在套接字级别工作(尽管可以)。 Python在其标准库中构建了几个更高级别的Web / http库。

例如,在Python 2中,您可以使用 :

import urllib2

response = urllib2.urlopen('http://www.example.com/')
html = response.read()

还可以查看 ,获得稍低级别的访问权限:

>>> import httplib
>>> conn = httplib.HTTPConnection("www.python.org")
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
#!/usr/bin/env python

import urllib

f = urllib.urlopen('http://www.example.com')
print f.read()
f.close()

在你开始需要做任何繁重的工作之前,很多例子似乎微不足道,比如在两个方向上传输千兆字节的数据。 我最喜欢的是ruby的net/http ,它是每个ruby安装的一部分。

这是一个流式传输数据的示例,并在您完成更多请求时保持连接处于打开状态。

require 'net/http'

http = Net::HTTP.new('my.server.org')
http.start

req = Net::HTTP::Post.new('/path/to/huge/file')
req.basic_auth('user', 'pass')
req.content_length = File.size 'huge_input_file.txt'
req.body_stream = File.open('huge_input_file.txt', 'rb')

http.request(req){|res|
  File.open('huge_output_file.txt', 'wb'){|f|
    res.read_body {|chunk| f.write chunk}
  }
}

Perl没有任何内置功能。 Net::HTTPLWP::UserAgent不是perl核心的一部分。 前段时间我需要一个perl http客户端,其功能类似于上面的ruby示例,而不依赖于CPAN中的任何内容。 它花了不到200行,只使用IO::Socket::INETsyswrite / sysread (它消除了很多低层套接字废话),以及MIME::Base64进行身份验证。

我认为你实际上并不想编写自己的http客户端,而是使用http获取内容的脚本?

其他人提到和 ..

以下是使用文档中的的示例。

# Quick JSON request
my $trends = 'http://search.twitter.com/trends.json';
print $client->get($trends)->res->json->{trends}->[0]->{name};

# Extract data from HTML and XML resources
print $client->get('mojolicious.org')->res->dom->at('title')->text;

# Scrape the latest headlines from a news site
my $news = 'http://digg.com';
$client->max_redirects(3);
$client->get($news)->res->dom('h3 > a.story-title')->each(sub {
    print shift->text . "\n";
});

酷,但不是最成熟的模块可用..

我无法看到你从这个问题的任何答案中得到什么可能的好处,但我会屈服于同伴的压力。 既然你似乎不打扰使用哪种语言......

如果你想以有趣的方式操纵它:

<?php
$d=new DOMDocument();
$d->loadHTMLFile('http://www.example.com/');
...

但是要返回一个页面:

<?php
print file_get_contents('http://www.example.com/');
  相关解决方案