[Funland] Hội những người đang tự học lập trình Mobile

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Thế mà cụ bảo là ngoại đạo :P
Cụ xơi thẳng API của nó luôn cũng hay, em thì thích kéo về server mình tính toán lựa cái phù hợp mới cấp API, nếu thế cụ thử cái react đi, em thấy hay mà, nó tân tiến, cũng dùng js cả thôi.
Nói thực là ngoại đạo mà, từ hồi covid bị giam trong nhà nhiều quá nên mới nghĩ ra học thêm mấy cái này: lúc đầu Python, rồi SQL (Postgresql), rồi Java, rồi Android Studio, sau này sẽ xem nốt cả JS và Kotlin nữa. Mục tiêu bây giờ là phải ra được app được lên Play Store.

Sent from Nokia 8.1 via OTOFUN
 

Of.NguyenLinh

Xe ngựa
Người OF
Biển số
OF-291212
Ngày cấp bằng
6/6/06
Số km
28,703
Động cơ
1,476,978 Mã lực
Nơi ở
Sản phẩm chăm sóc xe nextzett
Website
1z-vietnam.com
Nói thực là ngoại đạo mà, từ hồi covid bị giam trong nhà nhiều quá nên mới nghĩ ra học thêm mấy cái này: lúc đầu Python, rồi SQL (Postgresql), rồi Java, rồi Android Studio, sau này sẽ xem nốt cả JS và Kotlin nữa. Mục tiêu bây giờ là phải ra được app được lên Play Store.

Sent from Nokia 8.1 via OTOFUN
Sao cụ giống em thế, em lúc đầu Python, xong lọ mọ sang React.
Em cũng do dịch nên rảnh :))
App của em đây cụ.
Em đang chờ duyệt app thứ 2 :))
App màu đen là em thuê :P
15E7AF56-3A31-4C38-B192-630B0054F72C.png
 

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Bạn làm app cẩn thận thế, mình thấy dịch vụ rửa xe thì cứ tằng tằng mà làm, dịch bệnh cũng chả ảnh hưởng gì. Thấy thu tiền đều tay lắm mà hehe

Sent from Nokia 8.1 via OTOFUN
 

Hà Duy Phương

Xe tải
Biển số
OF-202359
Ngày cấp bằng
16/7/13
Số km
395
Động cơ
325,229 Mã lực

Of.NguyenLinh

Xe ngựa
Người OF
Biển số
OF-291212
Ngày cấp bằng
6/6/06
Số km
28,703
Động cơ
1,476,978 Mã lực
Nơi ở
Sản phẩm chăm sóc xe nextzett
Website
1z-vietnam.com

Of.NguyenLinh

Xe ngựa
Người OF
Biển số
OF-291212
Ngày cấp bằng
6/6/06
Số km
28,703
Động cơ
1,476,978 Mã lực
Nơi ở
Sản phẩm chăm sóc xe nextzett
Website
1z-vietnam.com
Bạn làm app cẩn thận thế, mình thấy dịch vụ rửa xe thì cứ tằng tằng mà làm, dịch bệnh cũng chả ảnh hưởng gì. Thấy thu tiền đều tay lắm mà hehe

Sent from Nokia 8.1 via OTOFUN
Cũng tuỳ mô hình mà cụ :))
 

Of.NguyenLinh

Xe ngựa
Người OF
Biển số
OF-291212
Ngày cấp bằng
6/6/06
Số km
28,703
Động cơ
1,476,978 Mã lực
Nơi ở
Sản phẩm chăm sóc xe nextzett
Website
1z-vietnam.com

nvk155

Xe điện
Biển số
OF-149104
Ngày cấp bằng
13/7/12
Số km
2,669
Động cơ
384,947 Mã lực
Nơi ở
HẠ LONG
Cụ mầy mò tốt thế. Cháu cũng mầy, làm web thôi, dưng đc hơn tháng rồi chịu, ngồi nhiều lưng đau lắm 😭. Càng học càng thấy nó mênh mông quá.
 

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Có cụ nào dùng thạo Retrofit và Gson để lấy dữ liệu từ Http API không cho hỏi thăm kinh nghiệm với. Tự học oải thật.

Sent from Nokia 8.1 via OTOFUN
 

Hà Duy Phương

Xe tải
Biển số
OF-202359
Ngày cấp bằng
16/7/13
Số km
395
Động cơ
325,229 Mã lực

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Câu hỏi nhờ bạn Hà Duy Phương đây ạ:

1. Đầu tiên, mục đích của mình là lấy một số thông tin cơ bản ở link API này https://fantasy.premierleague.com/api/entry/1016/

(nó đơn giản chỉ là một API trong game fantasy football thôi; thông tin ban đầu thì mình muốn lấy các trường "id", "player_first_name", "player_last_name" và "player_region_name")

Công cụ sử dụng là Java và Android Studio

2. Cấp quyền truy cập internet trong file AndroidManifest

<uses-permission android:name="android.permission.INTERNET" />

và cập nhật thư viện retrofit 2 trong build.gradle

implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'

3. Các file java

a) User.java

package com.example.loveretrofit2;

public class User
{
private long id;
private String player_first_name;
private String player_last_name;
private String player_region_name;

//https://fantasy.premierleague.com/api/entry/1016/

//Setters and getters

@Override
public String toString() {
return "User [id=" + id + ", "
+ "first_name=" + player_first_name + ", "
+ "last_name=" + player_last_name + ", "
+ "region_name=" + player_region_name + "]";
}
}

b) UserApiResponse.java

package com.example.loveretrofit2;

public class UserApiResponse
{
private User data;

//Setters and getters

public String toString() {
return "UserApiResponse [data=" + data + "]";
}
}

c) UserService.java

package com.example.loveretrofit2;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;

public interface UserService {

//https://fantasy.premierleague.com/api/entry/1016/

@GET("/api/entry/{id}/")
public Call<UserApiResponse> getUser(@Path("id") long id);

}

d) UserServiceClient.java (chạy ở file này; chọn "run with coverage" với public class UserServiceClient sẽ được nhé)

package com.example.loveretrofit2;

import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

//https://fantasy.premierleague.com/api/entry/1016/

public class UserServiceClient
{
public static void main(String[] args)
{
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://fantasy.premierleague.com")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();

UserService service = retrofit.create(UserService.class);

Call<UserApiResponse> callSync = service.getUser(1016);

try {
Response<UserApiResponse> response = callSync.execute();
UserApiResponse apiResponse = response.body();
System.out.println(apiResponse);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

e) Sau khi chạy thì chương trình ra lỗi này

---- IntelliJ IDEA coverage runner ----
sampling ...
include patterns:
com\.example\.loveretrofit2\..*
exclude patterns:
java.io.EOFException: End of input at line 1 column 1 path $
at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1401)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:207)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:188)
at com.howtodoinjava.loveretrofit2.UserServiceClient.main(UserServiceClient.java:32)
Class transformation time: 0.019707087s for 1913 classes or 1.030166596968113E-5s per class

Process finished with exit code 0

Vậy nhờ bạn Hà Duy Phương và cộng đồng hỗ trợ nếu được.


Sent from Nokia 8.1 via OTOFUN
 
Chỉnh sửa cuối:

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Đây là nội dung file mà link API ở trên trỏ vào


pretty
{
"id": 1016,
"joined_time": "2020-08-15T09:43:13.001069Z",
"started_event": 1,
"favourite_team": 11,
"player_first_name": "Duong",
"player_last_name": "Lam",
"player_region_id": 234,
"player_region_name": "Vietnam",
"player_region_iso_code_short": "VN",
"player_region_iso_code_long": "VNM",
"summary_overall_points": 1783,
"summary_overall_rank": 185568,
"summary_event_points": 40,
"summary_event_rank": 5072579,
"current_event": 28,
"leagues":{
"classic":[{"id": 11, "name": "Liverpool", "short_name": "team-11", "created": "2020-08-15T09:00:47.011825Z",…],
"h2h":[],
"cup":{
"matches":[
{"id": 49330226, "entry_1_entry": 3822195, "entry_1_name": "Pique Blinders", "entry_1_player_name": "Tom Morgan",…},
{"id": 49130930, "entry_1_entry": 1016, "entry_1_name": "Hanoi FC", "entry_1_player_name": "Duong Lam",…}
],
"status":{"qualification_event": 16, "qualification_numbers": 4194304, "qualification_rank": 611971, "qualification_state": "QUALIFIED"…},
"cup_league": 315
}
},
"name": "Hanoi FC",
"kit": null,
"last_deadline_bank": 7,
"last_deadline_value": 1048,
"last_deadline_total_transfers": 30

Sent from Nokia 8.1 via OTOFUN
 
Chỉnh sửa cuối:

Hà Duy Phương

Xe tải
Biển số
OF-202359
Ngày cấp bằng
16/7/13
Số km
395
Động cơ
325,229 Mã lực
Đây là nội dung file mà link API ở trên trỏ vào


pretty
{
"id": 1016,
"joined_time": "2020-08-15T09:43:13.001069Z",
"started_event": 1,
"favourite_team": 11,
"player_first_name": "Duong",
"player_last_name": "Lam",
"player_region_id": 234,
"player_region_name": "Vietnam",
"player_region_iso_code_short": "VN",
"player_region_iso_code_long": "VNM",
"summary_overall_points": 1783,
"summary_overall_rank": 185568,
"summary_event_points": 40,
"summary_event_rank": 5072579,
"current_event": 28,
"leagues":{
"classic":[{"id": 11, "name": "Liverpool", "short_name": "team-11", "created": "2020-08-15T09:00:47.011825Z",…],
"h2h":[],
"cup":{
"matches":[
{"id": 49330226, "entry_1_entry": 3822195, "entry_1_name": "Pique Blinders", "entry_1_player_name": "Tom Morgan",…},
{"id": 49130930, "entry_1_entry": 1016, "entry_1_name": "Hanoi FC", "entry_1_player_name": "Duong Lam",…}
],
"status":{"qualification_event": 16, "qualification_numbers": 4194304, "qualification_rank": 611971, "qualification_state": "QUALIFIED"…},
"cup_league": 315
}
},
"name": "Hanoi FC",
"kit": null,
"last_deadline_bank": 7,
"last_deadline_value": 1048,
"last_deadline_total_transfers": 30

Sent from Nokia 8.1 via OTOFUN
Đây nhé bác.


File ApiClient
Java:
package com.example.test_android_native;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {

    private static Retrofit retrofit = null;
    private static final String BASE_URL = "https://fantasy.premierleague.com";
    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
File RetrofitService
Java:
package com.example.test_android_native;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Headers;

public interface RetrofitService {
    @GET("/api/entry/1016/")
    @Headers("User-Agent:PostmanRuntime/7.26.10")
    Call<JsonResponse> getData();
}
File JsonResponse
Java:
package com.example.test_android_native;

import com.google.gson.annotations.SerializedName;

public class JsonResponse {

    @SerializedName("id")
    private Integer id;
    @SerializedName("joined_time")
    private String joinedTime;
    @SerializedName("started_event")
    private Integer startedEvent;
    @SerializedName("favourite_team")
    private Integer favouriteTeam;
    @SerializedName("player_first_name")
    private String playerFirstName;
    @SerializedName("player_last_name")
    private String playerLastName;
    @SerializedName("player_region_id")
    private Integer playerRegionId;
    @SerializedName("player_region_name")
    private String playerRegionName;
    @SerializedName("player_region_iso_code_short")
    private String playerRegionIsoCodeShort;
    @SerializedName("player_region_iso_code_long")
    private String playerRegionIsoCodeLong;
    @SerializedName("summary_overall_points")
    private Integer summaryOverallPoints;
    @SerializedName("summary_overall_rank")
    private Integer summaryOverallRank;
    @SerializedName("summary_event_points")
    private Integer summaryEventPoints;
    @SerializedName("summary_event_rank")
    private Integer summaryEventRank;
    @SerializedName("current_event")
    private Integer currentEvent;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getJoinedTime() {
        return joinedTime;
    }

    public void setJoinedTime(String joinedTime) {
        this.joinedTime = joinedTime;
    }

    public Integer getStartedEvent() {
        return startedEvent;
    }

    public void setStartedEvent(Integer startedEvent) {
        this.startedEvent = startedEvent;
    }

    public Integer getFavouriteTeam() {
        return favouriteTeam;
    }

    public void setFavouriteTeam(Integer favouriteTeam) {
        this.favouriteTeam = favouriteTeam;
    }

    public String getPlayerFirstName() {
        return playerFirstName;
    }

    public void setPlayerFirstName(String playerFirstName) {
        this.playerFirstName = playerFirstName;
    }

    public String getPlayerLastName() {
        return playerLastName;
    }

    public void setPlayerLastName(String playerLastName) {
        this.playerLastName = playerLastName;
    }

    public Integer getPlayerRegionId() {
        return playerRegionId;
    }

    public void setPlayerRegionId(Integer playerRegionId) {
        this.playerRegionId = playerRegionId;
    }

    public String getPlayerRegionName() {
        return playerRegionName;
    }

    public void setPlayerRegionName(String playerRegionName) {
        this.playerRegionName = playerRegionName;
    }

    public String getPlayerRegionIsoCodeShort() {
        return playerRegionIsoCodeShort;
    }

    public void setPlayerRegionIsoCodeShort(String playerRegionIsoCodeShort) {
        this.playerRegionIsoCodeShort = playerRegionIsoCodeShort;
    }

    public String getPlayerRegionIsoCodeLong() {
        return playerRegionIsoCodeLong;
    }

    public void setPlayerRegionIsoCodeLong(String playerRegionIsoCodeLong) {
        this.playerRegionIsoCodeLong = playerRegionIsoCodeLong;
    }

    public Integer getSummaryOverallPoints() {
        return summaryOverallPoints;
    }

    public void setSummaryOverallPoints(Integer summaryOverallPoints) {
        this.summaryOverallPoints = summaryOverallPoints;
    }

    public Integer getSummaryOverallRank() {
        return summaryOverallRank;
    }

    public void setSummaryOverallRank(Integer summaryOverallRank) {
        this.summaryOverallRank = summaryOverallRank;
    }

    public Integer getSummaryEventPoints() {
        return summaryEventPoints;
    }

    public void setSummaryEventPoints(Integer summaryEventPoints) {
        this.summaryEventPoints = summaryEventPoints;
    }

    public Integer getSummaryEventRank() {
        return summaryEventRank;
    }

    public void setSummaryEventRank(Integer summaryEventRank) {
        this.summaryEventRank = summaryEventRank;
    }

    public Integer getCurrentEvent() {
        return currentEvent;
    }

    public void setCurrentEvent(Integer currentEvent) {
        this.currentEvent = currentEvent;
    }

}
File main activity
Java:
package com.example.test_android_native;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;


import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;


public class MainActivity extends AppCompatActivity {

    RetrofitService retrofitService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        retrofitService = initClient();
        retrofitService.getData().enqueue(new Callback<JsonResponse>() {
            @Override
            public void onResponse(Call<JsonResponse> call, Response<JsonResponse> response) {
                Log.d("HaDuyPhuong", String.valueOf(response.body().getId()));
                Log.d("HaDuyPhuong", String.valueOf(response.body().getPlayerFirstName()));
                Log.d("HaDuyPhuong", String.valueOf(response.body().getPlayerLastName()));
                Log.d("HaDuyPhuong", String.valueOf(response.body().getPlayerRegionName()));
            }

            @Override
            public void onFailure(Call<JsonResponse> call, Throwable t) {
                Log.d("HaDuyPhuong", t.getMessage());
            }
        });
    }

    public static RetrofitService initClient() {
        return ApiClient.getClient().create(RetrofitService.class);
    }
}
Minh họa.
Nguyên nhân không chạy là do code của bác chưa thêm header vào
Mã:
@Headers("User-Agent:PostmanRuntime/7.26.10")
 
Chỉnh sửa cuối:

Santo70

Xe buýt
Biển số
OF-160701
Ngày cấp bằng
14/10/12
Số km
560
Động cơ
353,319 Mã lực
Nhiệt liệt cảm ơn bạn nhé. Để lát nữa trời sáng hẳn rồi mình thử codes của bạn nhé. Đúng là "buồn ngủ gặp chiếu manh", mình vẫn đọc những bài viết hướng dẫn trên mạng làm theo mãi và áp vào ví dụ của mình mà không được đấy.
 
Thông tin thớt
Đang tải
Top