Bài tập web service

Đề bài:

Dùng thiết bị Android (iOS hoặc Windows Phone) truy xuất đến Web Service và đọc

dữ liệu trả về.

Mục tiêu:

- Biết cách truy xuất đến Web Service.

- Biết dùng thư viện hộ trợ tương tác với Web Service.

Gợi ý thực hiện:

pdf41 trang | Chia sẻ: Mr Hưng | Lượt xem: 994 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Bài tập web service, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
OST. - Nhận dữ liệu trả về và thực hiện chuyển đổi sang đối tượng Hướng dẫn chi tiết: Bước 1: Thực hiện biên dịch thêm thư viện “gson-2.2.2.jar”. compile files('libs/gson-2.2.2.jar') Bước 2: Khởi tạo các đối tượng để gửi yêu cầu đến Web Service (như đã hướng dẫn ở bài 1). DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); Bài tập Trang 33/40 String paramString = URLEncodedUtils.format(params, "utf-8"); HttpGet httpGet = new HttpGet(url + "?" + paramString); Bước 3: Thiết lập các thông số cho HttpGet. httpGet.setHeader("Accept", "application/json"); httpGet.setHeader("Accept-Encoding", "gzip"); Để truy cập vào những phương thức có yêu cầu tài khoản (ở đây đang dùng tài khoản “admin” và mật khẩu “123456”) thì ta thực hiện thiết lập cho các phương thức HttpGet, HttpPost Như sau: httpGet.addHeader("Authorization", "Basic " + Base64.encodeToString("admin:123456".getBytes(), Base64.NO_WRAP)); Bước 4: Đọc dữ liệu trả về và thực hiện chuyển đổi thành đối tượng đã được tạo trên project, với điều kiện các thuộc tính phải trùng khớp. Đối tượng tạo trên project. public class Food implements Serializable { private static final long serialVersionUID = 1L; private String Name; private String Decription, Image; private int Id, Type, Show; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getDecription() { return Decription; } public void setDecription(String decription) { Decription = decription; } public String getImage() { return Image; } public void setImage(String image) { Image = image; } Đọc dữ liệu trả về và thực hiện chuyển đổi sang đối tượng. Bài tập Trang 34/40 String resultString = convertStreamToString(inputStream); inputStream.close(); Log.e("TQKy", "resultString: " + resultString); T result = new GsonBuilder().create().fromJson( resultString, objectClass); Trong đó “objectClass” là “(Class) Food[].class”. Ta sẽ nhận được mảng “Food” được lưu trong biến “result”, chỉ cần ép kiểu về mảng “Food” là có thể duyệt và lấy từng đối tượng ra. Bước 5: Kiểm tra trạng thái của Web Service trả về. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { response.getAll(table, EResultCode.Succeed, result); } else if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) { response.getAll(table, EResultCode.Empty, result); } else if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_INTERNAL_SERVER_ERROR) { response.getAll(table, EResultCode.ServerError, result); } else if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { response.getAll(table, EResultCode.Unauthorized, null); } Bài tập Trang 35/40 Bài tập 4.2. Thực hiện gửi và nhận tài nguyên (hình ảnh, âm thanh) trên Android và dịch vụ Web. Đề bài: Dùng Android gửi file hình ảnh (.JPG) đến Web Service, viết phương thức nhận file hình ảnh và lưu xuống máy trên Web Service. Mục tiêu: - Biết cách gửi file đến Web Service. Gợi ý thực hiện: - Dùng phương thức HttpPost để hỗ trợ gửi file. - Khởi tạo “HttpEntity” để nhận file hình ảnh. Hướng dẫn chi tiết: Bước 1: Xây dựng phương thức để gửi dữ liệu đi trên Android. Bước 1. 1: Khởi tạo “DefaultHttpClient” và “HttpPost”. DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); Bước 1. 2: Khởi tạo lớp để hỗ trợ chuyển đổi file Bitmap sang mảng byte. ByteArrayOutputStream baos = new ByteArrayOutputStream(); ((Bitmap) object).compress(Bitmap.CompressFormat.JPEG, 100, baos); Các thông số cần quan tâm trong quá trình chuyển đổi.  “object” là kiểu dữ liệu Bitmap đã được chuyển đổi từ tấm hình sang.  “Bitmap.CompressFormat.JPEG” format của file cần gửi đi.  “100” là thực hiện nén hình (100 là không cần nén hình, giảm dần đến 0 thì mức độ nén cao nhất, có thể làm hình ảnh bị mờ).  “baos” là dùng để nhận dữ liệu từ Bitmap đã được chuyển đổi sang mảng Byte. Bước 1. 3: Lấy mảng Byte hình ảnh và thiết lập cho HttpEntity. byte[] imageBytes = baos.toByteArray(); String boundary = "-------------" + System.currentTimeMillis(); HttpEntity entity = MultipartEntityBuilder.create() .setBoundary(boundary) .addBinaryBody("img", imageBytes, ContentType.MULTIPART_FORM_DATA, "a.jpg") Bài tập Trang 36/40 .build(); Các thông số thiết lập cho HttpEntity khi khởi tạo lên:  “setBoundary” là dùng để phân cách giữa 2 hoặc nhiều file nếu có.  “addBinaryBody” thiết lập nội dung cần gửi đi. Các tham số như: “img” là nội dung cần gửi, “imageButes” là dữ liệu cần gửi, “ContentType.MULTIPART_FORM_DATA” là loại nội dung cần gửi và “a.jpg” là tên file được gửi lên. Bước 1. 4: Thiết lập cho HttpPost và thực hiện gửi dữ liệu đi. httpPost.setEntity(entity); try { HttpResponse httpResponse = defaultHttpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { } Bước 2: Xây dựng phương thức để nhận dữ liệu (được gửi từ Android) trên Web Service. Bước 2. 1: Kiểm tra dữ liệu gửi đến có chứa loại nội dung dạng “MULTIPART_FORM_DATA”. Nếu không có thì thông báo không hỗ trợ nhận loại dữ liệu này. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } Bước 2. 2: Thực hiện kiểm tra thư mục “Images” có tồn tại trên máy, nếu không có thì tự tạo thư mục. if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath("~/Ima ges/"))) { System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath ("~/Images/")); } Bước 2. 3: Lấy đường dẫn và lưu các file tạm vào thư mục đó. string root = HttpContext.Current.Server.MapPath("~/Images/"); var provider = new MultipartFormDataStreamProvider(root); Bài tập Trang 37/40 Bước 2. 4: Duyệt các file tạm, thực hiện kiểm tra và xử lý dữ liệu đầu vào. Sau đó thực hiện lưu lại trên máy tính. foreach (var fileData in provider.FileData) { if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName)) { return Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"); } string fileName = fileData.Headers.ContentDisposition.FileName; if (fileName.StartsWith("\"") && fileName.EndsWith("\"")) { fileName = fileName.Trim('"'); } if (fileName.Contains(@"/") || fileName.Contains(@"\")) { fileName = Path.GetFileName(fileName); } // lấy file tạm đổi tên và thiết lập loại file File.Move(fileData.LocalFileName, Path.Combine(root, fileName)); } Bước 2. 5: Thông báo đã được up thành công. return new HttpResponseMessage() { Content = new StringContent(“Đã up thành công”) }; Bài tập Trang 38/40 BÀI 5. TƯƠNG TÁC GIỮA WEB SERVICES VỚI CÁC WEB SERVICE KHÁC   Mục tiêu: Biết cách sử dụng các dịch vụ Web được cung cấp sẵn. Bài tập 5.1. Thực hiện lấy các thông tin từ dịch vụ Web của Yahoo. Đề bài: Xây dựng phương thức lấy thông tin dự báo thời tiết trong 4 ngày tiếp theo. Mục tiêu: - Biết sử dụng các lớp được cung cấp sẵn để đọc dữ liệu từ Web Service khác. - Lấy được thông tin dự báo thời tiết do api Yahoo cung cấp. Gợi ý thực hiện: - Tạo một dịch vụ mới cho Web Service. - Tạo lớp “XmlDocument” để lấy dữ liệu từ Web Service. - Tạo lớp để đọc dữ liệu nhận về từ “XmlDocument”. Hướng dẫn chi tiết: Bước 1: Tạo phương thức nhận về địa điểm cần muốn xem dự báo thời tiết. Bước 2: Thực hiện lấy mã vị trí muốn xem dự báo thời tiết. string locationId = GetLocationId(location); if (locationId == null) { return "not found"; } Với phương thức “GetLocationId” được viết như sau: private string GetLocationId(string location) { string text = location.Replace(" ", "").ToLower(); switch (text) { case "bacgiang": return "VMXX0002"; Bài tập Trang 39/40 case "bienhoa": return "VMXX0003"; case "cantho": return "VMXX0004"; case "haiphong": return "VMXX0005"; case "hanoi": return "VMXX0006"; case "hochiminh": return "VMXX0007"; case "hoabinh": return "VMXX0008"; case "namdinh": return "VMXX0011"; case "vungtau": return "VMXX0018"; case "camau": return "VMXX0031"; case "phuquoc": return "VMXX0032"; default: return null; } } Để xem các địa điểm còn lại, tham khảo tại link: https://weather.codes/vietnam/ Bước 3: Khởi tạo lớp “XmlDocument” để thực hiện lấy thông tin từ api của Yahoo. XmlDocument doc = new XmlDocument(); doc.Load("" + locationId); Bước 4: Thực hiện lọc và lấy các thông tin cần thiết. XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("yweather", ""); XmlNodeList nodes = doc.SelectNodes("/rss/channel/item/yweather:forecast", ns); Bước 5: Duyệt danh sách dữ liệu và trả về cho client. string result = ""; foreach (XmlNode node in nodes) { result += node.Attributes["day"].InnerText + ": " + node.Attributes["text"].InnerText + ", " + node.Attributes["low"].InnerText + "F - " + node.Attributes["high"].InnerText + "F; "; } return result; Bài tập Trang 40/40

Các file đính kèm theo tài liệu này:

  • pdfbaitapchitiet.pdf
Tài liệu liên quan