2014-11-18 3 views
0

У меня есть проект Android, созданный в Xamarin (.NET). Я хочу преобразовать в родную Java. В приложении Xamarin я построил класс API, используемый для доступа к данным HTTP с использованием дженериков, который выглядит следующим образом:HttpClient Replicate in Java from C#

public class InventoryAPI { 
HttpClientHandler handler; 
Uri baseAddress; 
HttpClient client; 

public InventoryAPI() { 
    // .. Init code here 
} 

public async Task<Response> EnrolMultipleItemsAsync(EnrolItemModel[] _items) { 
    try { 
     var result = await PostAsync<Response>("api/inventory/enrolmultipleitems", _items); 
     Console.WriteLine(result.Message); 
     return result; 
    } 
    catch (Exception ex) { 
     App.Current.Logger.LogInfo("Exception at InventoryAPI - Error: EnrolItemAsync:"); 
     App.Current.Logger.LogError(ex.Message); 
     throw ex; 
    } 
} 
public Response EnrolMultipleItems(EnrolItemModel[] _items) { 
    try { 
     var result = Post<Response>("api/inventory/enrolmultipleitems", _items); 
     return result; 
    } 
    catch (Exception ex) { 
     App.Current.Logger.LogInfo("Exception at InventoryAPI - Error: EnrolItem:"); 
     App.Current.Logger.LogError(ex.Message); 
     throw ex; 
    } 
} 

private async Task<T> PostAsync<T>(string apiLocation, object postData) { 
    var response = await client.PostAsync(apiLocation, postData.ToHttpContentString()); 
    T result = default(T); 
    if (response.StatusCode == HttpStatusCode.OK) { 
     var json = await (response.Content.ReadAsStringAsync()); 
     result = DeserializeJson<T>(json); 
    } 
    return result; 
} 

private T Post<T>(string apiLocation, object postData) { 
    var response = client.PostAsync(apiLocation, postData.ToHttpContentString()).Result; 
    T result = default(T); 
    if (response.StatusCode == HttpStatusCode.OK) { 
     var json = response.Content.ReadAsStringAsync().Result; 
     result = DeserializeJson<T>(json); 
    } 
    return result; 
} 
public T DeserializeJson<T>(string json) { 
    var parsed = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json); 
    return parsed; 
} 
} 

Мне нравится этот стиль API и он работал хорошо в приложении Xamarin, так что теперь я хочу переносить это на Java - и вот где я застрял!

Вот что я до сих пор:

public class APIDownloader extends AsyncTask<String, Void, String> { 

@Override 
protected String doInBackground(String... ts) { 
    String url = ts[0].toString(); 
    return Get(url); 
} 

private String Get(String url) { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 

    HttpEntity entity = null; 
    String result = ""; 

    try { 
     //Execute and get the response. 
     HttpResponse response = httpclient.execute(httpget); 
     entity = response.getEntity(); 

     if (entity != null) { 
      result = EntityUtils.toString(entity); 
      //final JSONArray jObject = new JSONArray(EntityUtils.toString(entity)); 
     } 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Catch no internet connectivity exception 
     e.printStackTrace(); 
    } 
    return result; 
    } 
} 

, а затем отдельный класс API:

public class InventoryAPI { 

public List<LocationModel> GetAllLocations() throws IOException { 
    String url = "https://domain.com/api/inventory/getall"; 
    String response = null;// Get(url); 

    try { 
     response = new APIDownloader().execute(url).get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

    Gson gson = new Gson(); 
    LocationModel[] mcArray = gson.fromJson(response, LocationModel[].class); 
    return Arrays.asList(mcArray); 
    } 
} 

Хотя код Java выше действительно работает просто отлично (я только реализован GET так далеко), похоже, что это быстро выходит из-под контроля, особенно после того, как я переношу методы POST в библиотеку C# на пакет Java.

Какой был бы лучший подход к репликации API-интерфейса Xamarin API I, описанного выше в Java?

+0

«.. Кажется, что он скоро выйдет из-под контроля ...» Добро пожаловать на Java. ;) Но со всей серьезностью лучше разработать API, чем 'AsyncTask', но ваш вопрос слишком расплывчато, чтобы ответить кратко и слишком сильно полагаться на мнение (т. Е. Использовать этот шаблон дизайна или эту библиотеку), imo. –

ответ

2

Если вы собираетесь отправиться на родную Java, сделайте себе одолжение и используйте Retrofit. Это избавит вас от тонкости кода в вашем уровне API. Обычный материал Java Http является уродливым, Retrofit делает его намного проще.

Когда вам станет удобно, посмотрите на RxAndroid (RxJava), чтобы действительно помочь с некоторыми из вашего кода Async.