לגשת לWEB API כ serviceRefernce
-
יש לי קונטרולר API כזה:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebApiProducts.Models; namespace WebApiProducts.Controllers { public class HomeController : ApiController { List<Produuct> products = new List<Produuct>(); public IEnumerable<Produuct> GetAllProducts() { GetProducts(); return products; } private void GetProducts() { products.Add(new Produuct { Id = 1, Name = "Television", Category = "Electronic", Price = 82000 }); products.Add(new Produuct { Id = 2, Name = "Refrigerator", Category = "Electronic", Price = 23000 }); products.Add(new Produuct { Id = 3, Name = "Mobiles", Category = "Electronic", Price = 20000 }); products.Add(new Produuct { Id = 4, Name = "Laptops", Category = "Electronic", Price = 45000 }); products.Add(new Produuct { Id = 5, Name = "iPads", Category = "Electronic", Price = 67000 }); products.Add(new Produuct { Id = 6, Name = "Toys", Category = "Gift Items", Price = 15000 }); } public IEnumerable<Produuct> GetProducts(int selectedId) { if (products.Count() > 0) { return products.Where(p => p.Id == selectedId); } else { GetProducts(); return products.Where(p => p.Id == selectedId); } } } }
שאני רוצה לגשת אליו מ wifForm, עשיתי בוינפורם צרף סרוויס רפרנס ונתתי את הURL של הAPI
קיבלתי הודעת שגיאה.
כאן מדברים על זה אבל לא הבנתי אם נתנו תשובה או רק אמרו שאי אפשר.
בכל אופן מה כן הדרך?תודה רבה
פורסם במקור בפורום CODE613 ב26/05/2016 19:45 (+03:00)
-
Service Reference זה מיועד בשביל Web Service מהסוגים שנתונים סכמה ממנה ניתן לבנות את כל המתודות והפרמטרים הקיימים, ואז זה אין בweb api (מה שנקרא rest).
אז מה עושים? עובדים טיפה ידנית, ראה פה:
http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client
המאמר שמה משתמש במחלקה Microsoft.AspNet.WebApi.Client, מה שהיא עושה מעבר לבקשות ידניות מהשרת זה זה מיפוי JSON או XML לאובייקטים.
ישנה מחלקה נוספת אולי קלה יותר לעבודה מול WebApi, שמה RestSharp ותוכל להתקינה גם דרך nuget.במקרה שלך שגם אתה עשית את הצד שרת זה מאוד פשוט: עליך לשתף את הלקוח במחלקות
(או ע"י שתשים את המחלקות בפרוייקט עצמאי ויהיה גם לשרת וגם ללקוח רפרנסים עליו, או ע"י שתוסיף ללקוח קובץ מקושר - "linked file" ואז אותו הקובץ של המחלקות מקומפל הן לDLL של הלקוח והן לצד השרת. כשמדובר בapi שלא שלך ניתן ליצור את המחלקות בקלות ע"י העתקה של פלט הjson ובVS לבחור בתפריט Edit בSpecial Past ושם Json As Class).
ואז לעשות כמו שרואים במאמר הנ"ל.פורסם במקור בפורום CODE613 ב26/05/2016 20:46 (+03:00)
-
שיתפתי את הלקוח בספריה אבל הוא כותב שה-JSON לא מאותו סוג, אלא הסוג שהתקבל הוא מערך של [1,2,3]
ואני מנסה להכניס אותו לאובייקט כזה { Place: 'Israel' ,Name:' jerusalem'} לדוגמא.
זה מאוד מוזר כי ה-JSON נבנה לפי המחלקה של השרת שעשיתי לה קופי פייסט ללקוח.חוץ מזה, במקרה שה API לא שלי
נתקעתי בנקודה של לתפוס את הפלט של הJSONאני לא מצליח למצוא את התוכן ב response
רק באופן הזה:
[code2= csharp:2c1lm506]var product = await response.Content.ReadAsStringAsync();[/code2:2c1lm506]
אבל כל הצורה של האובייקט נהרסה.פורסם במקור בפורום CODE613 ב27/05/2016 01:36 (+03:00)
-
אתה צריך לקבל את הJSON באופן שנשלח. אצלך זה נשלח כIEnumerable של Producet, אז ככה אתה צריך לקבל אותו. ניסיתי אצלי ועבד:
client.BaseAddress = new Uri("http://localhost:24798/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.GetAsync("api/values/1"); if (response.IsSuccessStatusCode) { IEnumerable<Produuct> products = await response.Content.ReadAsAsync<IEnumerable<Produuct>>(); }
בקשר לAPI שאיננו שלך אז אני הסברתי שאתה יכול להעתיק ללוח את הJSON (קח אותו מהדפדפן או מReadAsStringAsync), ואז להדביק בהבקה מיוחדת כפי שכתבתי בתפריט Edit > Past Special > Past Json As Classes
פורסם במקור בפורום CODE613 ב27/05/2016 13:50 (+03:00)