7 Ekim 2018 Pazar

OKHTTP NEDİR VE ANDROİD İLE KULLANIMI


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

// OKHHTP Request oluşturuluyor.

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


<?xml version="1.0" encoding="utf-8"?>
<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.

Hiç yorum yok:

Yorum Gönderme