Web sunucusuna http istekleri göndermek
ve almak için kullanılmaktadır.
1. OKHttp Özellikleri
OkHttp, Üçüncü parti açık kaynak kütüphanesidir. OkHttp
Avantajlarını ve çalışma şeklini şu şekilde anlatabiliriz.
1.
Kullanıcı dostu API.
2.
Bir makineden gelen tüm istekler için
aynı soketi paylaşan http desteği sunmaktadır.
3.
Yerleşik bağlantı havuzu, tekrar
bağlantı desteği ve gecikme azaltma desteği mevcuttur.
4.
GZIP indirme boyutunu küçülterek işlem
yapmaktadır.
5.
Tekrarlanan istekleri önbelleğe alarak
engelleme işlemi yapmaktadır.
6.
TLS şifreleme protokolünü
kullanmaktadır.
7.
Android 2.3 ve bu sürümden sonraki
sürümler ile kullanılmaktadır.
8.
Verilen cevaplarda gecikme sürelerini
azaltmaktadır.
2. Build.gradle'da OkHttp Kütüphanesi'ni
ekleyin.
OkHttp kütüphanesini
kullanmadan önce, android stüdyoda aşağıdaki gibi build.gradle dosyasında
bağımlılıklar eklemeniz gerekir. En yeni yapı kütüphanesini https://github.com/square/okhttp adresinden
alabilirsiniz .
Kodu aşağıdaki gibi
ekledikten sonra, projeyi senkronize etmek için sağ üstteki Senkronize Et
bağlantısını tıklamanız gerekir.
dependencies
{
compile fileTree(include: ['*.jar'], dir:
'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',
{
exclude group: 'com.android.support',
module: 'support-annotations'
})
compile
'com.android.support:appcompat-v7:26.+'
compile
'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:design:26.+'
compile
'com.android.support:percent:24.2.1'
compile
'com.android.support:recyclerview-v7:26.+'
compile 'com.google.android:flexbox:0.3.0'
compile 'com.google.code.gson:gson:2.8.2'
compile
'com.squareup.okhttp3:okhttp:3.10.0'
}
OKHTTP Get Request
Request.Builder builder = new Request.Builder();
// url ayarlanıyor.
builder = builder.url(url);
//Request objesi olusturuluyor.
Request request = builder.build();
//Call nesnesi olusturuldu
Call call = okHttpClient.newCall(request);
OKHTTP Post Request
//OKHHTP için FormBody oluşturulup veriler atanıyor.FormBody.Builder formBodyBuilder = new FormBody.Builder();
// Forma paremtreler giriliyor.
formBodyBuilder.add("q", "trump");
formBodyBuilder.add("first", "2");
//Formbody işlemi build ediliyor.
FormBody formBody = formBodyBuilder.build();
//OKHTPP Request objesi olusturuluyor
Request.Builder builder = new Request.Builder();
builder = builder.url(url);
builder = builder.post(formBody);
Request request = builder.build();
// Post işlemi için call objesi olusturldu.
Call call = okHttpClient.newCall(request);
Eşzamanlı ve Eşzamansız
Request Tipi
Eşzamanlı request işlemi yapmak için thread
oluşturmamız gerekmektedir.
Response response = call.execute();
Eşzamansız request işlemi
yapmak için aşağıdaki sistemi uygulamamız gerekmektedir.
call.enqueue(new Callback() {......});
OkHttp Get Post Request
Örnegi
MainActivity.java
package com.dev2qa.example.network;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.dev2qa.example.R;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpActivity extends AppCompatActivity {
private static final String TAG_OK_HTTP_ACTIVITY = "OK_HTTP_ACTIVITY";
private EditText pageUrlEditor = null;
private Button syncGetButton = null;
private Button asyncGetButton = null;
private Button syncPostButton = null;
private Button asyncPostButton = null;
private TextView respTextView = null;
private OkHttpClient okHttpClient = null;
// Handler olusturuldu
private Handler displayRespTextHandler = null;
private static final int COMMAND_DISPLAY_SERVER_RESPONSE = 1;
private static final String KEY_SERVER_RESPONSE_OBJECT = "KEY_SERVER_RESPONSE_OBJECT";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok_http);
setTitle("yazilimtuneli.com - Android OkHttpClient Örnegi");
// Init methodu ile OKHTTP sekronizasyonu saglandı.
initControls();
// Buton işlemine tıklanıyor.
syncGetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = pageUrlEditor.getText().toString();
if (!URLUtil.isHttpUrl(url) && !URLUtil.isHttpsUrl(url)) {
Toast.makeText(getApplicationContext(), "Url girişi saglayiniz.", Toast.LENGTH_LONG).show();
}else {
// Eşzamanlı işlemi için Thread olusturuldu
Thread okHttpExecuteThread = new Thread() {
@Override
public void run() {
String url = pageUrlEditor.getText().toString();
try {
// Create okhttp3.Call object with get http request method.
Call call = createHttpGetMethodCall(url);
// Call şeklinde donen metodu response yolladı .
Response response = call.execute();
// yollanan response basarili sekilde donus yaptımı
boolean respSuccess = response.isSuccessful();
if (respSuccess) {
// Servisden gelen veri parclanmak üzere methoda //yollandı.
String respData = parseResponseText(response);
sendChildThreadMessageToMainThread(respData);
} else {
sendChildThreadMessageToMainThread("Response işleminden olumlu cevap donuşu olmadı.");
}
} catch (Exception ex) {
Log.e(TAG_OK_HTTP_ACTIVITY, ex.getMessage(), ex);
sendChildThreadMessageToMainThread(ex.getMessage());
}
}
};
//Thread işlemi baslatildi.
okHttpExecuteThread.start();
}
}
});
asyncGetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = pageUrlEditor.getText().toString();
if (!URLUtil.isHttpUrl(url) && !URLUtil.isHttpsUrl(url)) {
Toast.makeText(getApplicationContext(), "Please input a url start with http or https.", Toast.LENGTH_LONG).show();
}else {
try {
Call call = createHttpGetMethodCall(url);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
sendChildThreadMessageToMainThread("Response işlemi basarisizliga ugradi.");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String respData = parseResponseText(response);
sendChildThreadMessageToMainThread(respData);
}
}
});
}catch(Exception ex)
{
Log.e(TAG_OK_HTTP_ACTIVITY, ex.getMessage(), ex);
sendChildThreadMessageToMainThread(ex.getMessage());
}
}
}
});
syncPostButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = pageUrlEditor.getText().toString();
if (!URLUtil.isHttpUrl(url) && !URLUtil.isHttpsUrl(url)) {
Toast.makeText(getApplicationContext(), "Url giriş saglayiniz.", Toast.LENGTH_LONG).show();
}else {
Thread okHttpExecuteThread = new Thread() {
@Override
public void run() {
String url = pageUrlEditor.getText().toString();
try {
Call call = createHttpPostMethodCall(url);
Response response = call.execute();
boolean respSuccess = response.isSuccessful();
if (respSuccess) {
String respData = parseResponseText(response);
sendChildThreadMessageToMainThread(respData);
} else {
sendChildThreadMessageToMainThread("Request işlemi hataya ugradi");
}
} catch(Exception ex)
{
Log.e(TAG_OK_HTTP_ACTIVITY, ex.getMessage(), ex);
sendChildThreadMessageToMainThread(ex.getMessage());
}
}
};
okHttpExecuteThread.start();
}
}
});
asyncPostButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = pageUrlEditor.getText().toString();
if (!URLUtil.isHttpUrl(url) && !URLUtil.isHttpsUrl(url)) {
Toast.makeText(getApplicationContext(), "Please input a url start with http or https.", Toast.LENGTH_LONG).show();
}else {
try
{
Call call = createHttpPostMethodCall(url);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
sendChildThreadMessageToMainThread("Asynchronous http post request failed.");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful())
{
String respData = parseResponseText(response);
sendChildThreadMessageToMainThread(respData);
}
}
});
}catch(Exception ex)
{
Log.e(TAG_OK_HTTP_ACTIVITY, ex.getMessage(), ex);
sendChildThreadMessageToMainThread(ex.getMessage());
}
}
}
});
}
private void initControls()
{
if(pageUrlEditor == null)
{
pageUrlEditor = (EditText)findViewById(R.id.ok_http_url_editor);
}
if(syncGetButton == null)
{
syncGetButton = (Button)findViewById(R.id.ok_http_client_synchronous_get);
}
if(asyncGetButton == null)
{
asyncGetButton = (Button)findViewById(R.id.ok_http_client_asynchronous_get);
}
if(syncPostButton == null)
{
syncPostButton = (Button)findViewById(R.id.ok_http_client_synchronous_post);
}
if(asyncPostButton == null)
{
asyncPostButton = (Button)findViewById(R.id.ok_http_client_asynchronous_post);
}
if(respTextView == null)
{
respTextView = (TextView)findViewById(R.id.ok_http_client_resp_text_view);
}
if(displayRespTextHandler == null)
{
displayRespTextHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
if(msg.what == COMMAND_DISPLAY_SERVER_RESPONSE)
{
Bundle bundle = msg.getData();
String respText = bundle.getString(KEY_SERVER_RESPONSE_OBJECT);
// Display server response text in text view.
respTextView.setText("");
respTextView.scrollTo(0,0);
respTextView.setText(respText);
}
}
};
}
if(okHttpClient == null)
{
okHttpClient = new OkHttpClient();
}
}
private Call createHttpGetMethodCall(String url)
{
Request.Builder builder = new Request.Builder();
builder = builder.url(url);
Request request = builder.build();
Call call = okHttpClient.newCall(request);
return call;
}
private Call createHttpPostMethodCall(String url)
{
FormBody.Builder formBodyBuilder = new FormBody.Builder();
formBodyBuilder.add("q", "yazilimtuneli");
formBodyBuilder.add("first", "2");
FormBody formBody = formBodyBuilder.build();
Request.Builder builder = new Request.Builder();
builder = builder.url(url);
builder = builder.post(formBody);
Request request = builder.build();
Call call = okHttpClient.newCall(request);
return call;
}
private String parseResponseText(Response response)
{
int respCode = response.code();
String respMsg = response.message();
List<String> headerStringList = new ArrayList<String>();
Headers headers = response.headers();
Map<String, List<String>> headerMap = headers.toMultimap();
Set<String> keySet = headerMap.keySet();
Iterator<String> it = keySet.iterator();
while(it.hasNext())
{
String headerKey = it.next();
List<String> headerValueList = headerMap.get(headerKey);
StringBuffer headerBuf = new StringBuffer();
headerBuf.append(headerKey);
headerBuf.append(" = ");
for(String headerValue : headerValueList)
{
headerBuf.append(headerValue);
headerBuf.append(" , ");
}
headerStringList.add(headerBuf.toString());
}
String respBody = "";
try {
respBody = response.body().string();
}catch(IOException ex)
{
Log.e(TAG_OK_HTTP_ACTIVITY, ex.getMessage(), ex);
}
ServerResponseDTO respDto = new ServerResponseDTO();
respDto.setRespCode(respCode);
respDto.setRespMessage(respMsg);
respDto.setHeaderStringList(headerStringList);
respDto.setRespBody(respBody);
return respDto.toString();
}
private void sendChildThreadMessageToMainThread(String respData)
{
Message message = new Message();
message.what = COMMAND_DISPLAY_SERVER_RESPONSE;
Bundle bundle = new Bundle();
bundle.putString(KEY_SERVER_RESPONSE_OBJECT, respData);
message.setData(bundle);
displayRespTextHandler.sendMessage(message);
}
}
activity_main.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/ok_http_url_editor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Web sayfasi girişi yapınız(http/https)."/>
<Button
android:id="@+id/ok_http_client_synchronous_get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Synchronous Get"/>
<Button
android:id="@+id/ok_http_client_asynchronous_get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Asynchronous Get"/>
<Button
android:id="@+id/ok_http_client_synchronous_post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Synchronous Post"/>
<Button
android:id="@+id/ok_http_client_asynchronous_post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Asynchronous Post"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/ok_http_client_resp_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dev2qa.example">
<!-- Example required permission. -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".network.OkHttpActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Bir sonraki yazımızda görüşmek dileğiyle
sağlıcakla kalınız.
0 Yorumlar
Bizimle fikirlerinizi paylaşabilirsiniz.