REST NetbeanのWebサービスIDE Jersey FrameworkとJavaを使用して。
ユーザーがユーザー名とパスワードを提供する必要があるすべてのリクエストに対して、この認証はベストプラクティスではないことを知っています(次のようなcurlコマンドを使用します:curl -u username:password -X PUT http://localhsot:8080/user
)。
次に、REST WebサービスをAndroidクラスから呼び出します。
どうすればいいですか?
Android DefaultHttpClient
とCredentialUsernameAndPassword
を使用するクラスがありますが、Eclipseで実行すると、ランタイム例外またはSDK例外が発生することがあります。
これはサンプルのrestclientクラスです
public class RestClient
{
public enum RequestMethod
{
GET,
POST
}
public int responseCode=0;
public String message;
public String response;
public void Execute(RequestMethod method,String url,ArrayList<NameValuePair> headers,ArrayList<NameValuePair> params) throws Exception
{
switch (method)
{
case GET:
{
// add parameters
String combinedParams = "";
if (params!=null)
{
combinedParams += "?";
for (NameValuePair p : params)
{
String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
if (combinedParams.length() > 1)
combinedParams += "&" + paramString;
else
combinedParams += paramString;
}
}
HttpGet request = new HttpGet(url + combinedParams);
// add headers
if (headers!=null)
{
headers=addCommonHeaderField(headers);
for (NameValuePair h : headers)
request.addHeader(h.getName(), h.getValue());
}
executeRequest(request, url);
break;
}
case POST:
{
HttpPost request = new HttpPost(url);
// add headers
if (headers!=null)
{
headers=addCommonHeaderField(headers);
for (NameValuePair h : headers)
request.addHeader(h.getName(), h.getValue());
}
if (params!=null)
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
executeRequest(request, url);
break;
}
}
}
private ArrayList<NameValuePair> addCommonHeaderField(ArrayList<NameValuePair> _header)
{
_header.add(new BasicNameValuePair("Content-Type","application/x-www-form-urlencoded"));
return _header;
}
private void executeRequest(HttpUriRequest request, String url)
{
HttpClient client = new DefaultHttpClient();
HttpResponse httpResponse;
try
{
httpResponse = client.execute(request);
responseCode = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
HttpEntity entity = httpResponse.getEntity();
if (entity != null)
{
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
instream.close();
}
}
catch (Exception e)
{ }
}
private static String convertStreamToString(InputStream is)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
}
catch (IOException e)
{ }
return sb.toString();
}
}
最近、サードパーティのライブラリ- Square Retrofit が非常にうまく機能することを発見しました。
RESTエンドポイントの定義
public interface GitHubService {
@GET("/users/{user}/repos")
List<Repo> listRepos(@Path("user") String user,Callback<List<User>> cb);
}
具体的なサービスを取得する
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);
RESTエンドポイントを呼び出す
List<Repo> repos = service.listRepos("octocat",new Callback<List<User>>() {
@Override
public void failure(final RetrofitError error) {
Android.util.Log.i("example", "Error, body: " + error.getBody().toString());
}
@Override
public void success(List<User> users, Response response) {
// Do something with the List of Users object returned
// you may populate your adapter here
}
});
ライブラリは、jsonのシリアル化と非シリアル化を処理します。シリアル化と逆シリアル化もカスタマイズできます。
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(Date.class, new DateTypeAdapter())
.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setConverter(new GsonConverter(gson))
.build();
あなたがやっていることでやめて! :)
RESTfulクライアントをSERVICEとして実装し、集中的なネットワークをアクティビティに依存しないコンポーネントであるSERVICEに委任します。
この洞察力に富んだビデオをご覧ください http://www.youtube.com/watch?v=xHXn3Kg2IQE Virgil Dobjanschiがこの課題へのアプローチを説明しています...
私はこれを使用します RESTクライアント Androidの場合。これは本当にクールに見えます。ルークによる素晴らしい作品。
http://lukencode.com/2010/04/27/calling-web-services-in-Android-using-httpclient/
OkHttpClient
を使用して、安らかなWebサービスを呼び出しました。とても簡単です。
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = httpClient.newCall(request).execute();
String body = response.body().string()
Android RestTemplateでのSpringの使用 https://spring.io/guides/gs/consuming-rest-Android/
// The connection URL
String url = "https://ajax.googleapis.com/ajax/" +
"services/search/web?v=1.0&q={query}";
// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();
// Add the String message converter
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
// Make the HTTP GET request, marshaling the response to a String
String result = restTemplate.getForObject(url, String.class, "Android");
AndroidでRestFulを使用するには、以下の手順に従ってください。
Step1
Android空のプロジェクトを作成します。
Step2
インターネットアクセス許可が必要です。 AndroidManifest.xmlファイルに次のコードを記述します。
<uses-permission Android:name="Android.permission.INTERNET">
</uses-permission>
Step3
別のサーバーまたは同じマシンで実行されているRestFul urlが必要です。
Step4
AsyncTaskを拡張するRestFulクライアントを作成します。 RestFulPost.Javaを参照してください。
Step5
RestFull要求および応答のDTOクラスを作成します。
RestFulPost.Java
package javaant.com.consuming_restful.restclient;
import Android.app.ProgressDialog;
import Android.content.Context;
import Android.os.AsyncTask;
import Android.util.Log;
import com.google.gson.Gson;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.StringEntity;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.util.EntityUtils;
import Java.util.Map;
import javaant.com.consuming_restful.util.Util;
/**
* Created by Nirmal Dhara on 29-10-2015.
*/
public class RestFulPost extends AsyncTask<map, void,="" string=""> {
RestFulResult restFulResult = null;
ProgressDialog Asycdialog;
String msg;
String task;
public RestFulPost(RestFulResult restFulResult, Context context, String msg,String task) {
this.restFulResult = restFulResult;
this.task=task;
this.msg = msg;
Asycdialog = new ProgressDialog(context);
}
@Override
protected String doInBackground(Map... params) {
String responseStr = null;
Object dataMap = null;
HttpPost httpost = new HttpPost(params[0].get("url").toString());
try {
dataMap = (Object) params[0].get("data");
Gson gson = new Gson();
Log.d("data map", "data map------" + gson.toJson(dataMap));
httpost.setEntity(new StringEntity(gson.toJson(dataMap)));
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
DefaultHttpClient httpclient= Util.getClient();
HttpResponse response = httpclient.execute(httpost);
int statusCode = response.getStatusLine().getStatusCode();
Log.d("resonse code", "----------------" + statusCode);
if (statusCode == 200)
responseStr = EntityUtils.toString(response.getEntity());
if (statusCode == 404) {
responseStr = "{\n" +
"\"status\":\"fail\",\n" +
" \"data\":{\n" +
"\"ValidUser\":\"Service not available\",\n" +
"\"code\":\"404\"\n" +
"}\n" +
"}";
}
} catch (Exception e) {
e.printStackTrace();
}
return responseStr;
}
@Override
protected void onPreExecute() {
Asycdialog.setMessage(msg);
//show dialog
Asycdialog.show();
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
Asycdialog.dismiss();
restFulResult.onResfulResponse(s,task);
}
}
詳細と完全なコードについては、 http://javaant.com/consume-a-restful-webservice-in-Android/#.VwzbipN96Hs をご覧ください。
バックエンドは何ですか? Javaの場合、Jerseyを使用してREST with Java(JAX-RS)を使用できます。
Android側では、このシンプルなRestClientを使用して、そのRESTサービスを操作できます。
JSON <->両側のオブジェクトマッピング(Android、Javaバックエンド)の場合、GSONを使用できます。
おそらく遅れているか、すでに使用している可能性がありますが、 ksoap と呼ばれる別のものがあります。これは非常に驚くべきものです。タイムアウトも含まれ、任意のSOAPまた、解析に合わせていくつかの変更を加えました。
これは、単純なWebサービス呼び出し用に作成したライブラリです。
これを使用するには、1行のgradle依存関係を追加します-
compile 'com.scantity.ScHttpLibrary:ScHttpLibrary:1.0.0'
使用のデモは次のとおりです。
これを行うために利用可能なライブラリのトンがあります
Retrofitは、従来のAsyncTaskを置き換え、独自のバックグラウンドタスクを備えているため、実際に心配する必要はありません。 AsyncTaskと比較してパフォーマンスも非常に良好です。
ここで確認してください、
http://square.github.io/retrofit/
レトロフィットの完全な例はこちらにあります。
https://futurestud.io/blog/retrofit-getting-started-and-Android-client/
Volleyも効率的で使いやすいです。こちらをご覧ください:
https://github.com/mcxiaoke/Android-volley
Webには、その使用方法に関する多くのリソースがあります。
http://www.androidhive.info/2014/05/Android-working-with-volley-library-1
AsyncTask
またはAsyncTask
を実装してからdoInTheBackground()
メソッドをオーバーライドする必要があります-REST呼び出しを実装できます。
次に、onPostExecute()
を使用して、前の手順で返された結果をUIスレッドで処理できます。
この回答は、AsyncTask
の実装方法の良い例を提供します。 AsyncTask Android example を参照
以下のRufflesのコメントごとに、AsyncTaskを使用したREST呼び出しのより適切な例: http://alvinalexander.com/Android/android-asynctask-http-client-rest-example -tutorial