2013-04-05 26 views
5

Tôi có một url mà tôi cần phải thêm một khóa api để làm tham số. Khóa có% và các ký tự khác trong đó và không được mã hóa url, có cách nào để thực hiện điều này với furl không?Thư viện Python furl - Có cách nào để thêm thông số vào url không có mã hóa url không?

Heres mã hiện tại của tôi:

request_url = furl('http://www.domain.com/service/') \ 
    .add({ 
    'format'  : 'json', 
    'location'  : address_line_1 + ',' + city + ',' + state, 
    'key'   : APP_KEY 
}).url 
+0

Nhưng những ký tự đó _have_ sẽ được mã hóa URL nếu bạn muốn đây là URL hợp lệ (và hoạt động). Hãy tưởng tượng khóa API của bạn là, '123% 456% 789'. Nếu bạn chỉ sử dụng 'http: //www.domain.com/service/? Format = json & location = blah & key = 123% 456% 789', máy chủ sẽ thấy' khóa = 123E6x9'. – abarnert

+0

Có thể bạn không làm điều này một cách chính xác. Lý do để sử dụng một thư viện URL là để mã hóa không phải là một cái gì đó mà bạn thậm chí không kỹ thuật phải được nhận thức. –

+0

@ChrisDutrow: Công bằng, 'furl' được thiết kế để cho phép bạn trộn và kết hợp các chuỗi truy vấn được tạo theo cách thủ công và lập trình (ví dụ đầu tiên của chúng là tạo URL từ một chuỗi đã có'? One = 1' trên cuối cùng, và sau đó thêm 'hai = 2' theo nhiều cách khác nhau). – abarnert

Trả lời

1

Tôi có một url mà tôi cần thêm một chìa khóa api là một tham số. Khóa có% và các ký tự khác trong đó và không được mã hóa url

Điều đó không đúng. Nó phải được mã hóa URL. Nếu không, bạn kết thúc bằng URL không hợp lệ hoặc URL không có nghĩa là bạn muốn.

Ví dụ: giả sử khóa là 123%456%789. Nếu bạn gửi http://www.domain.com/service/?format=json&key=123%25456%25789, dịch vụ web ở đầu bên kia sẽ nhận được 123%456%789, sẽ thành công. Nếu bạn chỉ cần gửi http://www.domain.com/service/?format=json&key=123%456%789, dịch vụ web ở đầu bên kia sẽ nhận được 123E6x9, điều này sẽ không thành công.

Vì vậy, ví dụ của bạn đã chính xác và bạn không cần phải làm gì cả.

Nếu vì một lý do nào đó, bạn đã mã hóa URL APP_KEY trước khi bạn đến đây… tốt, đừng. Với một cái tên như thế, tôi đoán đó là một chữ thường được sao chép và dán vào mô-đun của bạn, điều đó có nghĩa là bạn phải mã hóa URL theo cách thủ công và sao chép và dán kết quả. Chỉ cần không làm điều đó, và bạn ổn.

Nếu bạn nhận được APP_KEY ở dạng mã hóa URL, bạn luôn có thể giải mã bằng, ví dụ: urlparse.parse_qs hoặc thậm chí với furl.

Nhưng nếu không ai trong số đó có vẻ hợp lý ...

là có một cách để làm điều này với furl?

No. Xem phần Encoding của tài liệu. furl chỉ hoạt động trên được giải mã tên và giá trị chuỗi truy vấn.

Nhưng có một cách dễ dàng xung quanh việc này. URL không phải là điều phức tạp và furl được thiết kế đặc biệt để cho phép bạn kết hợp và khớp các bit được tạo theo cách thủ công và theo lập trình. Hầu hết các ví dụ trong số README hiển thị chính xác điều đó, chẳng hạn như furl('http://www.google.com/?one=1').add({'two':2}).url. Vì vậy, nếu bạn đã có một tiền mã hóa "key=123%25456%25789" từ một nơi nào, chỉ cần dính vào nó trên chuỗi bằng tay trước khi đưa nó vào furl:

request_url = furl('http://www.domain.com/service/?key={}'.format(APP_KEY)) \ 
    .add({ 
    'format'  : 'json', 
    'location'  : address_line_1 + ',' + city + ',' + state, 
}).url 

Hacky? Vâng, vâng, trong đó bạn đang bước bên furl 's mã hóa, nhưng đó là chính xác những gì bạn đang yêu cầu làm thế nào để làm.

+0

Tôi đã làm việc với mapquest, nó xuất hiện khóa api của họ đến url mã hóa. Tôi đã chọn giải mã nó bằng urllib và sau đó đưa nó vào hàm add. –

+1

Có vẻ như trong trang web "Quản lý khóa ứng dụng" của họ, chúng hiển thị trang web được mã hóa trước. Đó là ngớ ngẩn. Tôi nghĩ rằng điều sạch nhất cần làm là giải mã nó trong trình thông dịch tương tác của bạn, sau đó lưu trữ phiên bản đã giải mã trong chương trình của bạn thay vào đó, đó là những gì nó có vẻ như bạn đã làm. (Tôi có thể thêm một bình luận giải thích những gì nó đã được giải mã và tại sao.) Nhưng việc nhúng nó vào URL thay vì sử dụng 'furl' có lẽ cũng hợp lý. – abarnert

Các vấn đề liên quan