Fetching URLs in Java

33 1.1K 0
Fetching URLs in Java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Một ứng dụng App Engine có thể kết nối đến các trang web khác trên Internet để lấy dữ liệu và giao tiếp với các dịch vụ web. Nó làm điều này không phải bằng cách mở một kết nối đến máy chủ từ xa từ máy chủ ứng dụng, nhưng thông qua một dịch vụ mở rộng được gọi là dịch vụ URL Fetch. Nó có thể chịu đựng việc duy trì các kết nối từ các máy chủ ứng dụng, và đảm bảo rằng tìm nạp tài nguyên thực hiện tốt bất kể như thế nào bất cứ xử lý yêu cầu được Tìm kiếm nguồn cùng một lúc. Cũng như với các bộ phận khác của cơ sở hạ tầng App Engine, URL Fetch dịch vụ được sử dụng bởi các ứng dụng khác của Google để nạp các trang web. Dịch vụ hỗ trợ Tìm kiếm URL bằng cách sử dụng giao thức HTTP, và sử dụng HTTP với SSL (HTTPS). Các phương pháp khác đôi khi kết hợp với URL (như FTP) không được hỗ trợ. Lưu ý rằng với các kết nối HTTPS, các dịch vụ không thể xác thực điểm đến của các kết nối, vì không có chuỗi chứng chỉ tin tưởng. Dịch vụ chấp nhận tất cả các chứng chỉ. Điều này có nghĩa các giao thức kết nối tự nó không thể bảo vệ chống lại maninthemiddle tấn công, mặc dù giao thông vẫn được mã hóa. Vì URL Fetch dịch vụ dựa trên cơ sở hạ tầng của Google, các dịch vụ thừa kế một vài hạn chế đã được đưa ra trong các thiết kế ban đầu của các proxy HTTP cơ bản. Dịch vụ hỗ trợ trong năm hành động HTTP thông thường nhất GET, POST, PUT, HEAD, và DELETE) nhưng không cho phép người khác hoặc sử dụng một hành động không chuẩn. Ngoài ra, nó chỉ có thể kết nối với các cổng TCP chuẩn cho từng phương pháp (80 cho HTTP, và 443 cho HTTPS). Các proxy sử dụng HTTP 1.1 để kết nối với máy chủ từ xa.

Chương 9: Bộ nhớ cache (The Memory Cache) Lưu trữ liệu lâu bền đòi hỏi phương tiện lưu trữ mà giữ liệu thông qua tổn thất điện hệ thống khởi động lại Hôm vừa lựa chọn ổ đĩa cứng, thiết bị lưu trữ bao gồm đĩa tròn phủ vật liệu từ tính mà liệu mã hóa Các đĩa cứng quay với tốc độ không đổi cảm biến chuyển động dọc theo bán kính, đọc viết bit đĩa cứng chúng qua Đọc viết mảnh liệu cụ thể đòi hỏi đĩa tìm kiếm để xác định vị trí cảm biến bán kính thích hợp chờ cho đĩa xoay liệu mong muốn bên Ổ đĩa cứng nhanh cách đáng kinh ngạc, tất thứ xem xét, ứng dụng web, tìm kiếm đĩa tốn Lấy thực thể từ kho liệu cách quan trọng thời gian vào thứ tự hàng chục mili giây Hầu hết ứng dụng web hiệu suất cao sử dụng nhớ cache Một nhớ cache nhớ sử dụng phương tiện lưu trữ ổn định, thường nhớ RAM máy cho cache nhanh chóng đọc viết truy cập vào giá trị Một nhớ cache phân phối cung cấp khả mở rộng, lưu trữ tạm thời phù hợp cho hệ thống phân phối, nhiều trình truy cập liệu Vì nhớ dễ bay hơi, bị xóa utage, cache không hữu ích để lưu trữ lâu dài, chí lưu trữ ngắn hạn cho liệu quan trọng Nhưng tuyệt vời hệ thống thứ cấp cho truy cập liệu nhanh giữ nơi khác, chẳng hạn kho liệu Nó đủ nhớ tốc độ cao toàn cầu số mục đích sử dụng App Engine dịch vụ phân phối nhớ cache, biết đến memcache danh dự hệ thống memcached ban đầu mà giống, cửa hàng cặp khóa-giá trị Bạn thiết lập giá trị với khóa, nhận giá trị cho khóa Một giá trị lên đến megabyte kích thước Một khóa lên đến 250 byte, API chấp nhận phím lớn sử dụng thuật toán băm để chuyển chúng đến 250 byte Thiết lập giá trị nhớ cache nguyên tử: khóa giá trị giữ lại tuổi (hoặc bỏ thiết lập) Các memcache không hỗ trợ giao dịch kho liệu không Nếu bạn nhận giá trị, sau cố gắng thiết lập giá trị dựa bạn có, giá trị thay đổi kể từ cường điệu App Engine memcache bao gồm khả tăng giảm giá trị giá trị số hoạt động nguyên tử Một cách phổ biến để sử dụng memcache với kho liệu để cache tổ chức kho liệu khoá chúng Khi bạn muốn lấy thực thể theo khóa, bạn kiểm tra memcache cho giá trị với khóa đó, sử dụng tìm thấy (được biết đến lần truy cập cache) Nếu memcache (cache), bạn lấy từ kho liệu, sau đặt memcache để truy cập tìm thấy chúng Với chi phí số lượng nhỏ chi phí trình tìm nạp, lộ trình trở nên nhanh nhiều Nếu thực thể thay đổi kho liệu, bạn cố gắng để cập nhật memcache thực thể cập nhật kho liệu, yêu cầu tiếp tục vào nhớ cache xem liệu Điều chủ yếu công trình, có hai vấn đề nhỏ Đối với một, cập nhật memcache thất bại cập nhật kho liệu thành công, để lại liệu cũ nhớ cache Ngoài ra, hai trình cập nhật thực thể kho liệu tương tự, sau cập nhật memcache, kho liệu có liệu xác (nhờ trao đổi kho liệu), cập nhật memcache có giá trị cập nhật sau Vì khả này, tốt xóa khóa memcache thay đổi kho liệu, lần tiếp đọc điền nhớ cache với giá trị Đương nhiên, việc xóa thất bại Vì cách để cập nhật hai kho liệu memcache trao đổi, cách để tránh khả nhớ cache chứa liệu cũ Để giảm thiểu tối đa thời gian mà memcache có giá trị cũ, bạn cung cấp cho giá trị thời gian hết hạn bạn thiết lập Khi thời gian hết hạn trôi qua, nhớ cache unsets khóa, kết đọc cache gây tươi lấy từ kho liệu Tất nhiên, mô hình nhớ đệm làm việc cho thực thể kho liệu Bạn sử dụng cho truy vấn kho liệu, gọi dịch vụ web thực với URL Fetch, tính toán tốn kém, liệu khác thay hoạt động chậm, nơi mà lợi ích việc truy cập nhanh vượt khả staleness Điều thường xảy với ứng dụng web mà cách tốt để cache linh hoạt Xem xét thông qua ứng dụng bạn cho hội để làm cho cân này, thực nhớ đệm giá trị cần thiết số tùy ý lần, đặc biệt số tăng với giao thông nội dung trang web viết trang web tin tức thường rơi vào thể loại Caching tăng tốc độ yêu cầu tiết kiệm thời gian CPU, làm giảm khả kho liệu đọc thất bại ảnh hưởng đến ứng dụng bạn Các API cho dịch vụ memcached đơn giản Chúng ta nhìn vào giao diện Python đầu tiên, sau giao diện Java, với trọng tâm nhớ đệm đơn vị kho liệu Các Java Memcached API (The Java Memcache API) Cũng dịch vụ khác, App Engine bao gồm hai giao diện Java với dịch vụ memcache Một giao diện độc quyền cung cấp truy cập trực tiếp đến tính dịch vụ Mặt khác thực JCache, tiêu chuẩn giao diện JSR 107 đề xuất Theo viết này, JSR 107 tiêu chuẩn phê duyệt, cách khuyến khích để sử dụng App Engine thay đổi liên tục Vì vậy, bây giờ, xem xét giao diện độc quyền Để biết thêm thông tin cách sử dụng giao diện JCache với App Engine, tham khảo tài liệu App Engine Các dịch vụ Java memcache API cho phép sử dụng đối tượng serializable khóa giá trị cặp khóa-giá trị lưu trữ nhớ cache Phím mà dạng lớn 250 byte băm đến 250 byte Các giá trị lên đến megabyte kích thước Trong nhiều trường hợp, bạn làm cho lớp liệu JPA serializable đơn giản cách khai báo lớp thực Serializable, thay đổi khác Nếu bạn sử dụng API kho liệu cấp thấp, lớp thực thể tất lớp giá trị thuộc tính thực thi giao diện Serializable Với dịch vụ App Engine memcache Java API, bạn tương tác với dịch vụ sử dụng đối tượng MemcacheService, mà bạn nhận từ MemcacheServiceFactory.getMemcacheService().Các thao tác có sẵn phương thức: MemcacheService: put(), get(), and delete() import com.google.appengine.api.memcache.MemcacheService; import com.google.appengine.api.memcache.MemcacheServiceFactory; // List headlines; MemcacheService memcache = MemcacheServiceFactory.getMemcacheService(); memcache.put("headlines", headlines); headlines = (List) memcache.get("headlines"); memcache.delete("headlines"); Phương thức put () nhận khóa giá trị, đối tượng serializable Được gọi với hai đối số này, giá trị lưu trữ thời gian hết hạn, hai tạo giá trị với phím thay sẵn có, có Để thiết lập giá trị với thời gian hết hạn, bạn put() đối tượng Expiration đối số thứ ba Bạn tạo giá trị với phương thức tĩnh lớp Expiration import com.google.appengine.api.memcache.Expiration; // memcache.put("headlines", headlines,Expiration.byDeltaSeconds(300)); Bạn sử dụng phương pháp thức thay thức byDeltaMillis(int) cho thời gian hết hạn milli-giây, onDate(java.util.Date) cho thời gian hết hạn vào thời điểm tuyệt đối tương lai Để thay đổi cách put () với giá trị với khóa, cung cấp giá trị MemcacheService.SetPolicy liệt kê đối số thứ tư Bạn sử dụng null cho đối số thứ ba bạn không muốn thiết lập thời hạn import com.google.appengine.api.memcache.MemcacheService.SetPolicy; // memcache.put("headlines", headlines, null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT); Ba lựa chọn thiết lập sách SET_ALWAYS (mặc định), ADD_ONLY_IF_NOT_PRESENT (chỉ tạo ra, không ghi đè lên), REPLACE CHỈ NẾU HIỆN TẠI (chỉ ghi đè lên, không tạo ra) Bạn kiểm tra xem nhớ cache contains giá trị với khóa đưa mà không lấy giá trị cách sử dụng Phương thức contains () Phương thức có khóa đối số nó, trả hay sai boolean headlinesAreCached = memcache.contains("headlines"); Để xóa giá trị cho khóa đó, bạn gọi phương pháp delete () với khóa đối số Bạn định số lượng thời gian mà trình không phép readd khóa, số nguyên dài mili giây đối số thứ hai Điều hữu ích cho việc đảm bảo nhiều quy trình người làm việc đồng thời làm việc với liệu không vô tình lùi lại nhớ cache xóa với cập nhật memcache.delete("tempnode91512", 5); API cấp thấp bao gồm phương thức để thiết lập, lấy, xóa nhiều mục lời gọi đợt Điều nhanh so với làm gọi dịch vụ cho mục Tuy nhiên, tổng kích thước lời gọi phản hồi giới hạn megabyte Phương thức putAll () lưu nhiều giá trị lô Nó chấp nhận Map khóa giá trị đối số Nó thể chấp nhận Expiration giá trị SetPolicy, đối tác đơn hàng import java.util.HashMap; import java.util.Map; // Map articleSummaries = new HashMap(); articleSummaries.put("article00174", " "); articleSummaries.put("article05234", " "); articleSummaries.put("article15820", " "); memcache.putAll(articleSummaries); Phương thức GetAll () trả nhiều mục lô Nó chấp nhận Collection khóa đối số nó, trả Map khóa giá trị cho tất khóa cung cấp tìm thấy nhớ cache import java.util.List; // List articleSummaryKeys = Arrays.asList( "article00174", "article05234", "article15820"); Map articleSummaries = memcache.getAll(articleSummaryKeys); Phương thức deleteAll () xóa nhiều mục lô Nó chấp nhận Collection khóa đối số Nó thể chấp nhận thời gian khóa đọc mili giây đối số thứ hai memcache.deleteAll(articleSummaryKeys); Bất kỳ giá trị memcached lưu trữ không gian tên Không gian tên cho phép bạn phân đoạn không gian loại mà bạn lưu trữ, bạn lo lắng xung đột sử dụng khác nhớ cache Để sử dụng không gian tên cấp thấp Java API, bạn thiết lập không gian tên MemcacheService cách gọi phương thức setNamespace () Tất hoạt động sử dụng không gian tên đưa thao tác giá trị memcache.setNamespace("News"); memcache.put("headlines", headlines); memcache.setNamespace("User"); memcache.put("headlines", userHeadlines); // Get User:"headlines" userHeadlines = (List) memcache.get("headlines"); / Get News:"headlines" memcache.setNamespace("News"); headlines = (List) memcache.get("headlines"); Nếu giá trị memcache số nguyên (int hay long), bạn tăng giảm số lượng nguyên tử-có nghĩa là, không can thiệp với trình khác làm điều tương tự cách sử dụng Phương thức increment () Phương pháp khóa số tiền thặng dư (mà làm xấu đi) Nó trả giá trị (Long), null giá trị lưu trữ với khóa memcache.put("work_done", 0); // Long workDone = memcache.increment("work_done", 1); Các Java API cấp thấp cung cấp quyền truy cập vào giá trị API JCache Phương thức getStatistics () trả đ ối tượng thống kê số liệu, với phương thức cho giá trị có sẵn import com.google.appengine.api.memcache.Stats; // Stats stats = memcache.getStatistics(); int ageOfOldestItemMillis = stats.getMaxTimeWithoutAccess(); Giá trị sẵn bao gồm: getHitCount() Đếm số lượng truy cập nhớ cache getMissCount() Đếm số lượng nhớ cache getItemCount() Số lượng mục có nhớ cache getTotalItemBytes() Tổng kích thước mục có nhớ cache getBytesReturnedForHits() Tổng số byte trả để đáp ứng với số truy cập nhớ cache, bao gồm khóa giá trị getMaxTimeWithoutAccess() Thời gian mục gần truy cập vào nhớ cache, vài giây Không có cách để thiết lập cách rõ ràng giá trị memcache Chúng tích lũy qua thời gian hoạt động dịch vụ, chủ yếu hữu ích cho so sánh tương đối thời gian ngắn ngủi thời gian Theo mặc định, dịch vụ memcache có lỗi truy cập dịch vụ, cấp thấp API API vận hành JCache khóa không tồn Cố gắng để đưa giá trị không âm thầm; phương thức bốn đối số put () trả false trường hợp này, put thất bại sách đề Những nỗ lực để có giá trị hoạt động nhớ cache Ở cấp thấp Java API, bạn thay đổi hoạt động cách cài đặt trình xử lý lỗi thay Phương thức setErrorHandler () MemcacheService đối tượng mà thực giao diện ErrorHandler Hai triển khai cung cấp: LogAndContinueErrorHandler StrictErrorHandler Mặc định LogAndContinueErrorHandler với mức độ ghi thiết lập để FINE (các "gỡ rối" cấp Administration Console) StrictErrorHandler ném MemcacheServiceException cho tất lỗi dịch vụ tạm thời import com.google.appengine.api.memcache.StrictErrorHandler; // memcache.setErrorHandler(new StrictErrorHandler()); Xử lý lỗi có đáp lại tùy chỉnh cho giá trị không hợp lệ lỗi dịch vụ Các loại ngoại lệ ném vận hành API bình thường Chương 10: Tìm nạp URL Tài nguyên Web (Fetching URLs in Java) Một ứng dụng App Engine kết nối đến trang web khác Internet để lấy liệu giao tiếp với dịch vụ web Nó làm điều cách mở kết nối đến máy chủ từ xa từ máy chủ ứng dụng, thông qua dịch vụ mở rộng gọi dịch vụ URL Fetch Nó chịu đựng việc trì kết nối từ máy chủ ứng dụng, đảm bảo tìm nạp tài nguyên thực tốt xử lý yêu cầu Tìm kiếm nguồn lúc Cũng với phận khác sở hạ tầng App Engine, URL Fetch dịch vụ sử dụng ứng dụng khác Google để nạp trang web Dịch vụ hỗ trợ Tìm kiếm URL cách sử dụng giao thức HTTP, sử dụng HTTP với SSL (HTTPS) Các phương pháp khác kết hợp với URL (như FTP) không hỗ trợ Lưu ý với kết nối HTTPS, dịch vụ xác thực điểm đến kết nối, chuỗi chứng tin tưởng Dịch vụ chấp nhận tất chứng Điều có nghĩa giao thức kết nối tự bảo vệ chống lại "man-inthe-middle" công, giao thông mã hóa Vì URL Fetch dịch vụ dựa sở hạ tầng Google, dịch vụ thừa kế vài hạn chế đưa thiết kế ban đầu proxy HTTP Dịch vụ hỗ trợ năm hành động HTTP thông thường GET, POST, PUT, HEAD, DELETE) không cho phép người khác sử dụng hành động không chuẩn Trả lời tin nhắn gửi ứng dụng đến địa người gửi, thông báo lỗi gửi máy chủ thư (chẳng hạn "Không thể kết nối với máy chủ từ xa") máy chủ mail từ xa (chẳng hạn "Người dùng không tìm thấy") Bạn sử dụng địa tài khoản Google nhà phát triển ứng dụng địa người gửi Để thêm tài khoản quản trị viên ứng dụng, chuyển đến mục phát triển giao diện Nếu bạn không muốn sử dụng tài khoản nhà phát triển cụ thể địa người gửi, bạn tạo tài khoản Google cho địa mục đích chung, sau thêm nhà phát triển cho ứng dụng Hãy chắn bạn bảo vệ mật tài khoản Google , đăng nhập vào tài khoản sửa đổi ứng dụng bạn Bạn sử dụng Gmail để theo dõi tài khoản để trả lời, bạn thiết lập chuyển tiếp email tự động Gmail để chuyển tiếp trả lời cho quản trị cụ thể danh sách gửi thư (hoặc Google Group) tự động Bạn sử dụng địa email người dùng địa người gửi địa tài khoản Google đăng ký, người dùng đăng nhập bắt đầu yêu cầu mà xử lý gửi email Đó là, bạn gửi email danh nghĩa người sử dụng "hiện tại" Điều hữu ích email kích hoạt hành động người dùng trả lời vào tin nhắn nên đến địa email người dùng Các tài khoản Google API không tiếp xúc với tên người đọc người sử dụng, bạn cung cấp, trừ bạn nhận từ người sử dụng Như đề cập trước đó, ứng dụng nhận tin nhắn email địa hình thức app-id@appspotmail.com anything@app-id.appspotmail.com, nơi app-id ID ứng dụng bạn điều chuỗi hợp lệ phía bên trái địa email (nó chứa biểu tượng @) Bạn sử dụng địa email đến người gửi tin nhắn email trả lời chuyển đến trình xử lý yêu cầu Các "bất điều gì" cho phép bạn tạo địa người gửi tùy chỉnh cách nhanh chóng Ví dụ, ứng dụng hỗ trợ khách hàng bắt đầu trò chuyện email với ID bao gồm ID địa email (support+ID@app- id.appspotmail.com), lưu trả lời cho chuyện kho liệu nên toàn chủ đề xem nhân viên dịch vụ khách hàng Lưu ý địa người gửi nhận lỗi ("trả lại") tin nhắn Nếu bạn sử dụng địa thư đến người gửi, bạn có tin nhắn trình lỗi ứng dụng để loại bỏ địa email không hợp lệ tự động Lưu ý máy chủ email khác từ xa sử dụng định dạng khác để thông báo lỗi Bất kỳ địa thư điện tử có tên thân thiện với người, chẳng hạn "The Example Nhóm " Làm bạn làm điều cụ thể cho giao diện; xem xét giao diện thời điểm Bạn bao gồm địa riêng biệt "Reply-to" địa người gửi ( "Từ") Hầu hết độc giả mail máy chủ sử dụng địa thay địa người gửi để trả lời thông báo lỗi "Reply-to" địa phải đáp ứng yêu cầu tương tự địa người gửi Các máy chủ phát triển không kiểm tra xem địa người gửi đáp ứng điều kiện nhà phát triển ứng dụng Hãy chắn để kiểm tra tính gửi email chạy App Engine Người nhận (Recipients) Một thông báo email gửi sử dụng địa cho người nhận, có nhiều người nhận Một người nhận người nhận ("To"), thứ "carbon-copy" người nhận (các "Cc" trường), "mù carbon-copy" người nhận ("Bcc") "To" "Cc" người nhận bao gồm nội dung tin nhắn, đó, câu trả lời dành cho tất người nhận gửi đến địa nhìn thấy Những người nhận "Bcc" nhận thông báo, địa họ không nằm nội dung tin nhắn, không bao gồm trả lời Các loại "Bcc" người nhận đặc biệt hữu ích bạn muốn có tin nhắn để tới nhiều người, bạn không muốn người nhận biết người nhận tin nhắn Bạn sử dụng kỹ thuật để gửi tin email cho người dùng mà không lộ địa email người dùng Một kỹ thuật phổ biến cho tin sử dụng địa người gửi "To" người nhận, làm cho người khác "Bcc" người nhận Số lượng người nhận email đếm hướng tới hạn mức nhận email hạn mức ban đầu nhỏ để ngăn chặn nhà quảng cáo email không mong muốn từ lạm dụng hệ thống Bạn tăng hạn mức cách phân bổ phần ngân sách bạn người nhận email Tập tin đính kèm (Attachments) Một ứng dụng đính kèm tập tin vào tin nhắn email Vì lý an ninh (chủ yếu phải làm với email máy khách không an toàn), có số loại tập tin phép đính kèm Tên tập tin phải kết thúc phần mở rộng phản ánh loại tập tin Bảng 11-1 liệt kê loại phép tương ứng với phần mở rộng tên tập tin cho phép Bảng 11-1 Các loại tập tin cho phép file đính kèm email, phần mở rộng tên tập tin cần thiết họ Những loại thường đủ cho nội dung email phong phú, không thiết phải cho tài liệu kinh doanh ứng dụng máy tính để bàn Nếu bạn muốn cung cấp loại file khác cho người sử dụng, lựa chọn gửi liên kết đến trình xử lý yêu cầu cung cấp tập tin thông qua trình duyệt Các liên kết cá nhân hoá tạm thời với ID nhất, hạn chế sử dụng xác thực tài khoản Google Gửi email Java (Sending Email in Java) Các giao diện Java với dịch vụ Mail giao diện chuẩn JavaMail (javax.mail *) Ngoài có giao diện cấp thấp, bạn truy cập tất tính dịch vụ thông qua việc thực JavaMail (Như vậy, thảo luận giao diện JavaMail đây.) Để sử dụng JavaMail, trước tiên bạn tạo "session" JavaMail Các đối tượng Session thường chứa thông tin cần thiết để kết nối với máy chủ mail, với App Engine, cấu hình cần thiết Bạn chuẩn bị thông điệp đối tượng MimeMessage, sau gửi cách sử dụng send() phương thức tĩnh lớp Transport Các lớp Transport sử dụng phiên gần tạo để gửi tin nhắn import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserServiceFactory; // User user = UserServiceFactory.getUserService().getCurrentUser(); String recipientAddress = user.getEmail(); Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); String messageBody = "Welcome to Example! Your account has been created." + "You can edit your user profile by clicking the" + "following link:\n\n" + "http://www.example.com/profile/\n\n" + "Let us know if you have any questions.\n\n" + "The Example Team\n"; try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("admin@example.com", "The Example Team")); message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress)); message.setSubject("Welcome to Example.com!"); message.setText(messageBody); Transport.send(message); } catch (AddressException e) { // An email address was invalid // } catch (MessagingException e) { Sending Email Messages | 261 // There was an error contacting the Mail service // } Như trình bày đây, bạn gọi phương thức MimeMessage để thiết lập trường để thêm người nhận nội dung Thông điệp đơn giản có người gửi (setFrom ()), "To" người nhận (addRecipient ()), đối tượng (setSubject ()), quan nhắn văn đơn giản (setText ()) Phương thức setFrom () nhận InternetAddress Bạn tạo InternetAddress với địa email (String) hay địa tên người đọc làm tham số cho hàm tạo Các địa email người gửi phải đáp ứng yêu cầu mô tả trước Bạn sử dụng chuỗi cho tên người hiểu Phương thức addRecipient () có loại người nhận InternetAddress Các loại người nhận cho phép Message.RecipientType.TO ("To", người nhận bản), Message.RecipientType.CC ("Cc" "carbon copy", người nhận phụ) Message.RecipientType.BCC ("Bcc "hoặc" carbon copy mù ", nơi người nhận gửi tin nhắn địa không xuất nội dung tin nhắn) Bạn gọi addRecipient () nhiều lần để thêm nhiều loại người nhận Phương thức setText () thiết lập khối văn đơn giản cho tin nhắn Để bao gồm phiên HTML khối thông báo cho bạn đọc mail hỗ trợ HTML, bạn tạo đối tượng MimeMultipart, sau tạo MimeBodyPart cho khối văn đơn giản cho khối HTML thêm chúng vào MimeMultipart Sau bạn làm cho nội dung MimeMultipart MimeMessage: import javax.mail.Multipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; // String textBody = " text "; String htmlBody = " HTML "; Multipart multipart = new MimeMultipart(); MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(textBody, "text/plain"); multipart.addBodyPart(htmlPart); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlBody, "text/html"); multipart.addBodyPart(htmlPart); message.setContent(multipart); Bạn đính kèm tập tin vào tin nhắn email cách tương tự: Multipart multipart = new MimeMultipart(); // byte[] fileData = getBrochureData(); String fileName = "brochure.pdf"; String fileType = "application/pdf"; MimeBodyPart attachmentPart = new MimeBodyPart(); attachmentPart.setContent(fileData, fileType); attachmentPart.setFileName(fileName); multipart.addBodyPart(attachmentPart); // message.setContent(multipart); Hãy nhớ tập tin đính kèm phải có loại phê duyệt, phải có tên tập tin kết thúc phần mở rộng tên tập tin tương ứng, liệt kê Bảng 11-1 Bạn thêm nhiều đối tượng MimeBodyPart MimeMultipart Khôi đơn giản văn bản, khối HTML, tập tin đính kèm phần tin nhắn MIME nhiều phần Khi sử dụng MimeMultipart, bạn phải bao gồm phần text/plain khối văn đơn giản tin nhắn Các đối tượng nhiều phần liệu ghi đè nội dung tập văn đơn giản MimeMessage với setText () App Engine’s thực thi giao diện JavaMail có lối tắt để gửi tin nhắn email cho tất cán quản lý ứng dụng Để gửi tin nhắn đến tất nhà quản lý, sử dụng địa người nhận "admins", biểu tượng @ tên miền Tiếp nhận tin nhắn email (Receiving Email Messages) Với dịch vụ email kích nội địa hoạt cấu hình, ứng dụng nhận tin nhắn email số địa Một tin nhắn qua thư đến chuyển đến ứng dụng hình thức yêu cầu HTTP Email gửi đến địa hình thức sau định hướng vào phiên mặc định ứng dụng: app-id@appspotmail.com anything@app-id.appspotmail.com Các yêu cầu HTTP sử dụng hành động POST, gửi đến đường dẫn URL sau đây: /_ah/mail/to-address Địa email người nhận tin nhắn bao gồm vào cuối đường dẫn URL, ứng dụng phân biệt giá trị khác "bất điều gì." Các khối nội dung yêu cầu HTTP POST hoàn tất thông điệp email MIME,bao gồm tiêu đề mail khối Nó phân tích thư viện có khả phân tích thông điệp email MIME Chúng xem xét ví dụ Python Java hai phần Các máy chủ phát triển giao diện điều khiển (http://localhost:8080/_ah/admin/) bao gồm tính cho mô email cách gửi mẫu web Các máy chủ phát triển nhận tin nhắn email thực tế Nhận email Java (Receiving Email in Java) Trong Java, bạn biết vị trí đường dẫn URL email gửi đến cho servlet với mục mô tả triển khai (web.xml): mailreceiver myapp.MailReceiverServlet mailreceiver /_ah/mail/* Các JavaMail servlet API cung cấp tất thứ cần phải phân tích thông điệp MIME nhiều phần yêu cầu HTTP POST Lớp MimeMessage (trong gói javax.mail.internet) có hàm tạo chấp nhận java.io.InputStream, mà nhận từ HttpServletRequest sử dụng phương thức getInputStream() Các hàm tạo dựng MimeMessage cần JavaMail phiên, đó, với việc gửi email, sử dụng cấu hình mặc định rỗng import java.io.IOException; import java.util.Properties; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.internet.MimeMessage; import javax.servlet.http.*; public class MailReceiverServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); try { MimeMessage message = new MimeMessage(session, req.getInputStream()); String contentType = message.getContentType(); Object content = message.getContent(); if (content instanceof String) { // A plain text body // } else if (content instanceof Multipart) { // A multipart body for (int i = 0; i < ((Multipart) content).getCount(); i++) { Part part = ((Multipart) content).getBodyPart(i); // } } } catch (MessagingException e) { // Problem parsing the message data // } } } Nếu tin nhắn gửi đến tin MIME nhiều phần liệu (chẳng hạn tin nhắn với khối HTML, file đính kèm), phương thức getContent () MimeMessage trả đối tượng mà thực giao diện Multipart Bạn sử dụng giao diện để có số phận (getCount ()) chọn phần số (getBodyPart (int index), trả BodyPart) Gửi tin nhắn XMPP (Sending XMPP Messages) Một ứng dụng App Engine gửi tin nhắn cho người sử dụng dịch vụ chat XMPP, bao gồm Google Talk máy chủ Jabber, sử dụng dịch vụ XMPP Mỗi bên tham gia giao XMPP có địa tương tự địa email, biết đến JID (JID viết tắt "Jabber ID", đặt theo tên dự án Jabber, nơi XMPP bắt nguồn.) Một JID bao gồm tên người dùng, "tại" biểu tượng (@), tên miền máy chủ XMPP Một JID có nguồn tài nguyên tùy chọn "chuỗi, mà sử dụng để xác định máy khách cụ thể kết nối với dịch vụ với tên người dùng; tin nhắn gửi đến ID mà tài nguyên đến tất khách hàng kết nối username@domain/resource Để gửi tin nhắn, người tham gia trò chuyện gửi thông báo XMPP đến máy chủ XMPP riêng danh bạ dịch vụ chat chủ dịch vụ người nhận người tham gia sử dụng tên miền JID cổng tiêu chuẩn, sau cung cấp tin nhắn Nếu dịch vụ từ xa chấp nhận thông điệp cho JID người kết nối với dịch vụ với máy khách trò chuyện cho JID, dịch vụ cung cấp thông điệp tới máy khách Hầu hết dịch vụ, bao gồm Google Talk, yêu cầu người dùng thiết lập mối quan hệ trước với người gửi trước thông tuyến đường trò chuyện với người dùng Người dùng thiết lập mối quan hệ với ứng dụng App Engine cách gửi lời mời trò chuyện với ứng dụng, cách chấp nhận lời mời trò chuyện gửi ứng dụng Ứng dụng App Engine gửi thư mời trò chuyện tin nhắn Dịch vụ App Engine XMPP sử dụng sở hạ tầng tương tự Google Talk, Jabber tương thích với dịch vụ nhắn tin tức thời Google Bạn sử dụng Google Talk trực tiếp qua ứng dụng Google Talk dành cho Windows, từ giao diện web Gmail, từ tiện ích web Google Talk, Jabber tương thích máy khách chat Bạn phát triển máy khách tùy chỉnh kết nối với Google Talk qua XMPP với tài khoản Google Đây ứng dụng chạy máy tính để bàn hay điện thoại di động có khả Internet, applet Flash chạy cửa sổ trình duyệt (Trình duyệt web không hỗ trợ làm cho kết nối trực tiếp XMPP Giao diện Gmail Google Talk sử dụng relay HTTP lưu trữ Google, mà giao thức nào.) Một máy khách tùy chỉnh kết nối theo cách có tin nhắn bị đẩy đến từ ứng dụng App Engine bạn Để biết thêm thông tin việc phát triển tùy chỉnh Google Talk máy khách, xem tài liệu nhà phát triển Google Talk: http://code.google.com/apis/talk/ Một thông báo XMPP bao gồm địa người gửi, địa người nhận nhiều hơn, loại tin nhắn, nội dung tin nhắn Địa người gửi phải địa XMPP đến ứng dụng Đây dạng app-id@appspot.com anything@app-id.appspotchat.com, nơi app-id ID ứng dụng bạn điều chuỗi hợp lệ phía bên trái JID (nó chứa biểu tượng @) Không giống địa email gửi đến, thuận tiện để sử dụng "bất điều gì" hình thức để tạo ID bay, kể từ người nhận cần phải chấp nhận lời mời từ ID trước nhận tin nhắn, có ích cho phiên bắt đầu với lời mời gọi địa đại diện cho mục đích sử dụng ứng dụng (support@app-id.appspotchat.com) cụ thể Nếu phiên ứng dụng gửi thông báo XMPP phiên mặc định, App Engine đổi địa người gửi đến địa phiên cụ thể, trả lời trực tiếp đến phiên xác: anything@version.latest.app-id appspotchat.com (app-id@appspot.com trở app-id@version.latest.app-id.appspotchat.com.) App Engine thêm "tài nguyên" để kết thúc JID người gửi (sau tên miền) trông này: / bot Điều chủ yếu để tuân thủ thực hành tốt việc gửi thư JIDs với nguồn tài nguyên Nó không ý người dùng trò chuyện, không cần thiết người dùng muốn gửi tin nhắn đến ứng dụng Bạn thấy tin nhắn đăng nhập Loại tin nhắn loại tiêu chuẩn XMPP, bao gồm "chat", "lỗi", "trò chuyện nhóm," "tiêu đề" "bình thường" Một ứng dụng nhận tin nhắn loại "chat" " bình thường ", tham gia trò chuyện nhóm Đối với truyền thông phía trước thẳng ứng dụng người dùng trò chuyện, bạn thường muốn gửi "chat" tin nhắn Đối với ứng dụng máy khách tùy chỉnh, bạn làm bạn thích Khi ứng dụng chạy máy chủ phát triển, gửi thông báo XMPP trò chuyện lời mời gọi làm cho máy chủ để in thông báo cửa sổ Console Các máy chủ phát triển không liên lạc với dịch vụ XMPP gửi tin nhắn Các API để gọi dịch vụ XMPP đơn giản Trong Python, hành động chức module google.appengine.api.xmpp Trong Java, hành động phương thức đối tượng XMPPService, mà bạn nhận từ XMPPServiceFactory.getXMPPService () (Không có tiêu chuẩn Java API cho này.) Gửi lời mời trò chuyện (Sending a Chat Invitation) Trong Java, JID đại diện đối tượng JID, mà bạn tạo cách thông qua địa chuỗi nhà xây dựng JID Để gửi lời mời, bạn gọi phương thức với hai đối số sendInvitation() import com.google.appengine.api.xmpp.JID; import com.google.appengine.api.xmpp.XMPPService; import com.google.appengine.api.xmpp.XMPPServiceFactory; // XMPPService xmpp = XMPPServiceFactory.getXMPPService(); // From app-id @appspot.com: xmpp.sendInvitation(JID("juliet@example.com")); // From a custom JID: xmpp.sendInvitation(JID("juliet@example.com"), JID("support@ app-id appspotchat.com")); Gửi tin nhắn trò chuyện (Sending a Chat Message) Theo mặc định, điều gửi tin nhắn kiểu "chat" Bạn gửi tin nhắn loại khác cách thiết lập các tham số message_type Giá trị chấp nhận bao gồm xmpp.MESSAGE_TYPE_CHAT xmpp.MESSAGE_TYPE_ERROR, (mặc định), xmpp.MESSAGE_TYPE_GROUPCHAT, xmpp.MESSAGE_TYPE_HEADLINE, xmpp.MESSAGE_TYPE_NORMAL Toàn tin nhắn XMPP gửi qua mạng liệu XML Theo mặc định, send_message () xử lý nội dung tin nhắn dạng văn bản, biết để bỏ ký tự XML Thay tin nhắn văn bản, bạn gửi đoạn XML Điều bao gồm nguyên văn (giả sử câu kệ hình thành) tin nhắn XMPP, bạn gửi liệu có cấu trúc cho máy khách XMPP Nói cho send_message () mà nội dung đoạn XML nên không bỏ ký tự XML, gán tham số raw_xml = True Các send_message () trả mã trạng thái cho người nhận JID, giá trị gọi với JID nhất, danh sách mã gọi với danh sách JIDs Các giá trị trạng thái xmpp.NO_ERROR, xmpp.INVALID_JID, xmpp.OTHER_ERROR Trong Java, bạn gửi tin nhắn cách gọi phương thức SendMessage () XMPPService Phương thức có đối tượng tin nhắn, mà bạn xây dựng với MessageBuilder object.sendMessage() trả đối tượng SendResponse, có chứa mã trạng thái cho người nhận định tin nhắn import com.google.appengine.api.xmpp.JID; import com.google.appengine.api.xmpp.Message; import com.google.appengine.api.xmpp.MessageBuilder; import com.google.appengine.api.xmpp.SendResponse; import com.google.appengine.api.xmpp.XMPPService; import com.google.appengine.api.xmpp.XMPPServiceFactory; // XMPPService xmpp = XMPPServiceFactory.getXMPPService(); JID recipient = new JID("juliet@example.com"); Message message = new MessageBuilder() withRecipientJids(recipient) withBody("Your dog has reached level 12!") build(); SendResponse success = xmpp.sendMessage(message); if (success.getStatusMap().get(recipient) != SendResponse.Status.SUCCESS) { // } Bạn sử dụng lớp MessageBuilder để lắp ráp (không thay đổi) đối tượng Message Bạn xâu chuỗi phương thức để xây dựng tin nhắn hoàn chỉnh câu lệnh đơn Phương thức có liên quan bao gồm: withBody(String body) Thiết lập nội dung thư asXml(boolean asXml) Khẳng định khối chứa đoạn hình thành XML (và văn gốc) withFromJid(JID jid) Thiết lập JID người gửi withRecipientJids(JID jid1, ) Thêm nhiều JIDs nhận withMessageType(MessageType type) Cài đặt loại tin nhắn build() Trả tin nhắn hoàn chỉnh [...]... javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserServiceFactory; // User user = UserServiceFactory.getUserService().getCurrentUser(); String recipientAddress = user.getEmail();... phương thức getInputStream() của nó Các hàm tạo dựng MimeMessage cũng cần một JavaMail phiên, trong đó, như với việc gửi email, có thể sử dụng cấu hình mặc định rỗng import java. io.IOException; import java. util.Properties; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.internet.MimeMessage; import javax.servlet.http.*;... byte Như đã trình bày, bạn có thể sử dụng một InputStreamReader (từ java. io) để xử lý các dòng byte như là một dòng kí tự Các lớp BufferedReader làm cho nó dễ dàng để đọc dòng văn bản từ InputStreamReader import java. net.URL; import java. net.MalformedURLException; import java. io.IOException; import java. io.InputStream; import java. io.InputStreamReader; import java. io.BufferedReader; // try { URL url =... Google Gửi email trong Java (Sending Email in Java) Các giao diện Java với dịch vụ Mail là giao diện chuẩn JavaMail (javax.mail *) Ngoài ra còn có một giao diện cấp thấp, mặc dù bạn có thể truy cập tất cả các tính năng của dịch vụ thông qua việc thực hiện JavaMail (Như vậy, chúng tôi sẽ chỉ thảo luận về giao diện JavaMail ở đây.) Để sử dụng JavaMail, trước tiên bạn tạo một "session" JavaMail Các đối tượng... tin đính kèm (Attachments) Một ứng dụng có thể đính kèm tập tin vào một tin nhắn email Vì lý do an ninh (chủ yếu là phải làm gì với các email máy khách không an toàn), chỉ có một số loại tập tin được phép đính kèm Tên tập tin phải kết thúc bằng một phần mở rộng phản ánh loại của tập tin Bảng 11-1 liệt kê các loại phép và tương ứng với các phần mở rộng tên tập tin cho phép Bảng 11-1 Các loại tập tin... chương này, chúng tôi sẽ giới thiệu các giao diện tiêu chuẩn và cấp thấp cho việc lấy URL đồng bộ Python và Java, cũng như giao diện đồng bộ cho các ứng dụng Python Tìm nạp URL trong Java (Fetching URLs in Java) Thời gian chạy Java bao gồm một thực hiện tuỳ chỉnh của lớp URLConnection trong gói java. net JRE tiêu chuẩn mà các lời gọi dịch vụ URL Fetch thay vì làm một kết nối socket trực tiếp Như với... làm cho nội dung MimeMultipart của MimeMessage: import javax.mail.Multipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; // String textBody = " text "; String htmlBody = " HTML "; Multipart multipart = new MimeMultipart(); MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(textBody, "text/plain"); multipart.addBodyPart(htmlPart); MimeBodyPart htmlPart... import java. io.BufferedReader; // try { URL url = new URL("http://ae-book.appspot.com/blog/atom.xml/"); InputStream inStream = url.openStream(); InputStreamReader inStreamReader = new InputStreamReader(inStream); BufferedReader reader = new BufferedReader(inStreamReader); // read characters or lines with reader reader.close(); } catch (MalformedURLException e) { // } catch (IOException e) { // ... Properties(); Session session = Session.getDefaultInstance(props, null); try { MimeMessage message = new MimeMessage(session, req.getInputStream()); String contentType = message.getContentType(); Object content = message.getContent(); if (content instanceof String) { // A plain text body // } else if (content instanceof Multipart) { // A multipart body for (int i = 0; i < ((Multipart) content).getCount();... Session.getDefaultInstance(props, null); String messageBody = "Welcome to Example! Your account has been created." + "You can edit your user profile by clicking the" + "following link:\n\n" + "http://www.example.com/profile/\n\n" + "Let us know if you have any questions.\n\n" + "The Example Team\n"; try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("admin@example.com",

Ngày đăng: 24/10/2016, 20:24

Từ khóa liên quan

Mục lục

  • Chương 9: Bộ nhớ cache (The Memory Cache)

    • Các Java Memcached API (The Java Memcache API)

    • Chương 10: Tìm nạp URL và Tài nguyên Web (Fetching URLs in Java)

      • Tìm nạp URL trong Java (Fetching URLs in Java)

      • Chương 11: Gửi, nhận thư và thông báo tức thì (Sending and Receiving Mail and Instant Messages)

        • Kích hoạt dịch vụ trong nước (Enabling Inbound Services)

        • Gửi thư điện tử (Sending Email Messages)

          • Địa chỉ người gửi (Sender Addresses)

          • Người nhận (Recipients)

          • Tập tin đính kèm (Attachments)

          • Gửi email trong Java (Sending Email in Java)

          • Tiếp nhận tin nhắn email (Receiving Email Messages)

            • Nhận email trong Java (Receiving Email in Java)

            • Gửi tin nhắn XMPP (Sending XMPP Messages)

              • Gửi một lời mời trò chuyện (Sending a Chat Invitation)

              • Gửi một tin nhắn trò chuyện (Sending a Chat Message)

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan