สวัสดี! วันนี้เราจะเพิ่มการสมัครรับข้อมูลกลุ่มบทความใน JavaRush สิ่งนี้สอดคล้องกับปัญหา JRTB-5บน GitHub ให้ฉันอธิบาย: JavaRush มีส่วนที่เรียกว่า Articlesและในนั้นก็มีกลุ่มของบทความ แนวคิดคือการรับการแจ้งเตือนเกี่ยวกับบทความใหม่จากกลุ่มหนึ่งหรือหลายกลุ่มผ่านทางบอตโทรเลข
รูปภาพแสดงว่าแบบสอบถามนี้รองรับพารามิเตอร์หลายตัว (แบบสอบถาม ประเภท ตัวกรอง) หากต้องการลองใช้คำขอนี้ คุณจะต้องค้นหา ปุ่ม ลองใช้หลังจากนั้นพารามิเตอร์เหล่านี้จึงสามารถกำหนดค่าได้:
คุณยังสามารถกำหนดค่าประเภท ตัวกรอง และข้อความค้นหาได้จากที่นั่น (ซึ่งน่าสนใจจริงๆ ที่นี่: นี่จะเป็นการค้นหาข้อความใน กลุ่ม). แต่สำหรับตอนนี้ มารันโดยไม่มีข้อจำกัดใดๆ และดูว่ามีกี่กลุ่มใน JavaRush โดยคลิกที่ดำเนินการ ด้านล่างจะมีการตอบกลับ (ในส่วนการตอบกลับของเซิร์ฟเวอร์) ต่อคำขอนี้:
เราเห็นว่ามี ทั้งหมด 30 กลุ่ม คำขอนี้เสร็จสมบูรณ์ใน 95ms และมีชุดของส่วนหัวบางส่วนในการตอบกลับ ต่อไป เรามาลองกำหนดค่าพารามิเตอร์บางตัวกัน เรามาเลือกพารามิเตอร์ประเภทเท่ากับค่า COMPANY แล้วดูว่าผลลัพธ์เปลี่ยนแปลงไปอย่างไร
มี 4 รายการ จะตรวจสอบได้อย่างไร ง่ายมาก: คุณสามารถไปที่เว็บไซต์ ค้นหาหัวข้อบทความ เลือกกลุ่มทั้งหมดและเพิ่มตัวกรองที่เหมาะสมที่นั่น ( https://javarush.com/groups/all?type=COMPANY ) ใช่ครับ มีแค่ 4 อันเท่านั้น จริงๆ แล้วมี 3 อัน :D
จนถึงตอนนี้ก็ยังพอเหมาะพอดี ว่าแต่ถ้าเราตรวจสอบมหาวิทยาลัยก็ยังไม่มีเลย เพื่อความสนุก ดูว่าเกิดอะไรขึ้นหากคุณตั้งค่า filter = MY ในเบราว์เซอร์ที่คุณเข้าสู่ระบบ Javarush และไม่ได้เข้าสู่ระบบ ข้อมูลเพิ่มเติมเกี่ยวกับผยอง - ในบทความเกี่ยวกับHabréนี้
ก่อนอื่น คุณต้องเพิ่ม Unitrest ซึ่งเป็นไลบรารีสำหรับสร้างคำขอ http ไปยัง JavaRush API:
แพ็คเกจdtoซึ่งเราจะเพิ่มคลาสต่อไปนี้ตามข้อมูลจากผยอง:
ตอกตะปูด้วยกล้องจุลทรรศน์ได้รับการตอบกลับจากคำขอ http ผ่าน Unirest แล้วแปลเป็นสตริง จากนั้นแยกวิเคราะห์สตริงนี้ผ่าน Jackson... มันน่ากลัว น่าเบื่อ และต้องการสิ่งเพิ่มเติมมากมาย ในห้องสมุด นี้ คุณสามารถดูได้ว่ามีลักษณะอย่างไร ทันทีที่ฉันได้ลงมือทำ ฉันจะปรับโครงสร้างทุกอย่างใหม่
ตอนนี้คำถามคือ: รหัสของเราทำงานตามที่เราคาดหวังหรือไม่? คำตอบนั้นง่าย: คุณเพียงแค่ต้องเขียนแบบทดสอบให้พวกเขา ดังที่ผมได้กล่าวไปหลายครั้งแล้ว นักพัฒนาซอฟต์แวร์จะต้องสามารถเขียนการทดสอบได้ ดังนั้น เมื่อใช้ Swagger UI ของเรา เราจะส่งคำขอ ดูการตอบกลับ และแทนที่ลงในการทดสอบตามผลลัพธ์ที่คาดหวัง คุณอาจสังเกตได้ทันทีว่าจำนวนกลุ่มไม่คงที่และสามารถเปลี่ยนแปลงได้ และคุณพูดถูก คำถามเดียวคือตัวเลขนี้เปลี่ยนแปลงบ่อยแค่ไหน? น้อยมาก ดังนั้นในช่วงหลายเดือนมานี้เราสามารถพูดได้ว่าค่านี้จะคงที่ และหากมีอะไรเปลี่ยนแปลงเราจะอัปเดตการทดสอบ พบกับ - JavaRushGroupClientTest:
กดไลค์ สมัครสมาชิก กระดิ่งให้ ดาว โครงการของเราเขียนความคิดเห็นและให้คะแนนบทความ!
เพิ่ม JRTB-5
สมมติว่าฉันสนใจบทความจากกลุ่มSuccess Stories ดังนั้นฉันจึงต้องการสมัครรับข้อมูลอัปเดตจากกลุ่มนี้และรับลิงก์ไปยังสิ่งพิมพ์ใหม่ทุกครั้ง ในส่วนหนึ่งของงานนี้ เราต้องเรียนรู้วิธีใช้ API แบบเปิดสำหรับการทำงานกับกลุ่มใน JavaRush ทันใดนั้นสิ่งนี้ก็มาถึง นี่คือลิงค์ไปยังคำอธิบายของ open APIเพื่อน! คุณต้องการทราบทันทีเมื่อมีการเผยแพร่โค้ดใหม่สำหรับโครงการหรือบทความใหม่หรือไม่? เข้าร่วมช่อง tg ของ ฉัน ที่นั่นฉันรวบรวมบทความ ความคิด และการพัฒนาโอเพ่นซอร์สไว้ด้วยกัน |
กร่างคืออะไร? ลองคิดดูตอนนี้
เรายังไม่ได้พูดถึงผยองเลย สำหรับผู้ที่ไม่ทราบ ฉันจะอธิบายสั้นๆ: นี่คือสถานที่ที่คุณสามารถดู API ของเซิร์ฟเวอร์อย่างเปิดเผย และพยายามส่งคำขอบางอย่างไปยังมัน โดยทั่วไปแล้ว กลุ่มคำขอที่เป็นไปได้แบบผยองจะจัดกลุ่ม ในกรณีของเรา มีสามกลุ่ม: ฟอรัม-คำถาม , กลุ่ม , โพสต์ ในแต่ละกลุ่มจะมีคำขอหนึ่งรายการขึ้นไปที่ระบุข้อมูลที่จำเป็นทั้งหมดในการสร้างคำขอนี้ (นั่นคือ พารามิเตอร์เพิ่มเติมใดที่สามารถส่งผ่านได้ จะทำอย่างไรกับพารามิเตอร์เหล่านี้ วิธี http ใด เป็นต้น) ฉันแนะนำให้คุณอ่านและดูเพิ่มเติมในหัวข้อนี้ เพราะนี่คือส่วนหนึ่งของการพัฒนาที่เกือบทุกคนจะต้องเจอ เพื่อทำความเข้าใจ มาดูกันว่ามีกี่กลุ่มใน JavaRush เมื่อต้องการทำเช่นนี้ ให้ ขยายกลุ่มตัวควบคุมกลุ่ม และเลือกรับคำขอ/api/1.0/rest/groups/count มันจะส่งคืนจำนวนกลุ่มใน JavaRush ให้เรา มาดูกัน:




การเขียนไคลเอ็นต์สำหรับ Javarush API สำหรับกลุ่ม
ในตอนนี้ เราจะเขียนไคลเอ็นต์ Java ที่ใช้ API แบบเปิดซึ่งสามารถส่งคำขอ รับการตอบกลับ และรู้ได้อย่างชัดเจนว่าอ็อบเจ็กต์ใดจะมาถึง นอกจากนี้เรายังจะนำวัตถุจากผยองจาก ส่วน แบบจำลอง (ที่ด้านล่างสุดของหน้า) มาสร้างแพ็คเกจใหม่และเรียกมันว่า javarushclient ถัดจาก service, repository ในอนาคต เราจะย้ายสิ่งนี้ไปยังไลบรารีแยกต่างหากภายในองค์กรชุมชน Javarush และจะใช้มันเป็นการพึ่งพาเท่านั้นฉันได้เขียนเกี่ยวกับการสร้างไคลเอนต์ Java ในบทความ“คำแนะนำในการสร้างไคลเอนต์สำหรับ Skyscanner API และการเผยแพร่ใน jCenter และ Maven Central” |
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>${unirest.version}</version>
</dependency>
และใส่เวอร์ชันลงในบล็อกคุณสมบัติ:
<unirest.version>3.11.01</unirest.version>
เมื่อเราได้รับการพึ่งพาแล้ว เราก็สามารถเริ่มเพิ่มโค้ดได้ มาสร้างไคลเอนต์สำหรับกลุ่ม JavaRushGroupClient และการนำไปใช้ในคลาส JavaRushGroupClientImpl แต่ก่อนอื่นคุณต้องสร้าง DTO (วัตถุการถ่ายโอนข้อมูล) นั่นคือคลาสที่วัตถุจะนำข้อมูลทั้งหมดที่จำเป็นสำหรับไคลเอนต์ คุณสามารถดูโมเดลทั้งหมดได้ในผยอง ที่ด้านล่างสุด มีส่วนโมเดลซึ่งคุณสามารถนับได้ นี่คือ ลักษณะของ GroupDiscussionInfoในผยอง: ในแพ็คเกจ javarushclient เราจะสร้าง 
-
MeGroupInfoStatus :
package com.github.javarushcommunity.jrtb.javarushclient.dto; /** * Member group status. */ public enum MeGroupInfoStatus { UNKNOWN, CANDIDATE, INVITEE, MEMBER, EDITOR, MODERATOR, ADMINISTRATOR, BANNED }
-
ข้อมูลกลุ่มฉัน :
package com.github.javarushcommunity.jrtb.javarushclient.dto; import lombok.Data; /** * Group information related to authorized user. If there is no user - will be null. */ @Data public class MeGroupInfo { private MeGroupInfoStatus status; private Integer userGroupId; }
-
ประเภทข้อมูลกลุ่ม :
package com.github.javarushcommunity.jrtb.javarushclient.dto; /** * Group Info type; */ public enum GroupInfoType { UNKNOWN, CITY, COMPANY, COLLEGE, TECH, SPECIAL, COUNTRY }
-
ข้อมูลการสนทนาของผู้ใช้ :
package com.github.javarushcommunity.jrtb.javarushclient.dto; import lombok.Data; /** * DTO for User discussion info. */ @Data public class UserDiscussionInfo { private Boolean isBookmarked; private Integer lastTime; private Integer newCommentsCount; }
-
การมองเห็นกลุ่ม :
package com.github.javarushcommunity.jrtb.javarushclient.dto; /** * Group Visibility status. */ public enum GroupVisibilityStatus { UNKNOWN, RESTRICTED, PUBLIC, PROTECTED, PRIVATE, DISABLED, DELETED }
-
จากนั้น - GroupInfo :
package com.github.javarushcommunity.jrtb.javarushclient.dto; import lombok.Data; import lombok.ToString; /** * Group Info DTO class. */ @Data @ToString public class GroupInfo { private Integer id; private String avatarUrl; private String createTime; private String description; private String key; private Integer levelToEditor; private MeGroupInfo meGroupInfo; private String pictureUrl; private String title; private GroupInfoType type; private Integer userCount; private GroupVisibilityStatus visibilityStatus; }
package com.github.javarushcommunity.jrtb.javarushclient.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* Group discussion info class.
*/
@EqualsAndHashCode(callSuper = true)
@Data
@ToString(callSuper = true)
public class GroupDiscussionInfo extends GroupInfo {
private UserDiscussionInfo userDiscussionInfo;
private Integer commentsCount;
}
เรายังจำเป็นต้องมีตัวกรองสำหรับ คำขอ GroupFilter :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* Filters for group requests.
*/
public enum GroupFilter {
UNKNOWN, MY, ALL
}
ในคำขอรับด้วย ID จะส่งกลับ GroupDiscussionInfo และในคำขอสำหรับคอลเลกชันของกลุ่ม คุณสามารถรับทั้ง GroupInfo และ GroupDiscussionInfo เนื่องจากคำขอสามารถมีประเภท การสืบค้น ตัวกรอง ออฟเซ็ต และขีดจำกัด เรามาสร้าง คลาส GroupRequestArgs แยกต่างหาก และทำให้เป็นคลาสตัวสร้าง (อ่านว่ารูปแบบตัวสร้างคืออะไร):
package com.github.javarushcommunity.jrtb.javarushclient.dto;
import lombok.*;
import java.util.HashMap;
import java.util.Map;
import static java.util.Objects.nonNull;
/**
* Request arguments for group requests.
*/
@Builder
@Getter
public class GroupRequestArgs {
private final String query;
private final GroupInfoType type;
private final GroupFilter filter;
/**
* specified where to start getting groups
*/
private final Integer offset;
/**
* Limited number of groups.
*/
private final Integer limit;
public Map populateQueries() {
Map queries = new HashMap<>();
if(nonNull(query)) {
queries.put("query", query);
}
if(nonNull(type)) {
queries.put("type", type);
}
if(nonNull(filter)) {
queries.put("filter", filter);
}
if(nonNull(offset)) {
queries.put("offset", offset);
}
if(nonNull(limit)) {
queries.put("limit", limit);
}
return queries;
}
}
ในการค้นหาจำนวนกลุ่มจะแตกต่างกันเล็กน้อย มีเพียงข้อความค้นหา ประเภท และตัวกรองเท่านั้น และดูเหมือนว่าคุณไม่ต้องการทำซ้ำโค้ด ในเวลาเดียวกันหากคุณเริ่มรวมเข้าด้วยกัน มันจะดูน่าเกลียดเมื่อทำงานกับผู้สร้าง ดังนั้นฉันจึงตัดสินใจแยกพวกมันออกและทำซ้ำโค้ด นี่คือ ลักษณะของ GroupCountRequestArgs :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
import lombok.Builder;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
import static java.util.Objects.nonNull;
/**
* Request arguments for group count requests.
*/
@Builder
@Getter
public class GroupsCountRequestArgs {
private final String query;
private final GroupInfoType type;
private final GroupFilter filter;
public Map populateQueries() {
Map queries = new HashMap<>();
if (nonNull(query)) {
queries.put("query", query);
}
if (nonNull(type)) {
queries.put("type", type);
}
if (nonNull(filter)) {
queries.put("filter", filter);
}
return queries;
}
}
ใช่ ฉันไม่ได้พูดถึงว่าสองคลาสสุดท้ายมีเมธอด populateQueries ซึ่งจะเตรียมแผนที่สำหรับการสร้างแบบสอบถาม (คุณจะเห็นในภายหลัง) จากคลาสที่อธิบายไว้ข้างต้น มาสร้างอินเทอร์เฟซสำหรับJavaRushGroupClient กัน :
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;
import java.util.List;
/**
* Client for Javarush Open API corresponds to Groups.
*/
public interface JavaRushGroupClient {
/**
* Get all the {@link GroupInfo} filtered by provided {@link GroupRequestArgs}.
*
* @param requestArgs provided {@link GroupRequestArgs}.
* @return the collection of the {@link GroupInfo} objects.
*/
List<GroupInfo> getGroupList(GroupRequestArgs requestArgs);
/**
* Get all the {@link GroupDiscussionInfo} filtered by provided {@link GroupRequestArgs}.
*
* @param requestArgs provided {@link GroupRequestArgs}
* @return the collection of the {@link GroupDiscussionInfo} objects.
*/
List<GroupDiscussionInfo> getGroupDiscussionList(GroupRequestArgs requestArgs);
/**
* Get count of groups filtered by provided {@link GroupRequestArgs}.
*
* @param countRequestArgs provided {@link GroupsCountRequestArgs}.
* @return the count of the groups.
*/
Integer getGroupCount(GroupsCountRequestArgs countRequestArgs);
/**
* Get {@link GroupDiscussionInfo} by provided ID.
*
* @param id provided ID.
* @return {@link GroupDiscussionInfo} object.
*/
GroupDiscussionInfo getGroupById(Integer id);
}
คำขอที่แตกต่างกันสองรายการสำหรับกรณีที่เราต้องการรับข้อมูล GroupInfo หรือ GroupDiscussionInfo ที่เพิ่ม มิฉะนั้น การสืบค้นเหล่านี้จะเหมือนกัน และข้อแตกต่างเพียงอย่างเดียวคือในแฟล็ก includeDiscussion หนึ่งรายการจะเป็นจริง และอีกรายการหนึ่งจะเป็นเท็จ ดังนั้นจึงมี 4 วิธี ไม่ใช่ 3 วิธี ตอนนี้เรามาเริ่มดำเนินการ:
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;
import kong.unirest.GenericType;
import kong.unirest.Unirest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Implementation of the {@link JavaRushGroupClient} interface.
*/
@Component
public class JavaRushGroupClientImpl implements JavaRushGroupClient {
private final String javarushApiGroupPath;
public JavaRushGroupClientImpl(@Value("${javarush.api.path}") String javarushApi) {
this.javarushApiGroupPath = javarushApi + "/groups";
}
@Override
public List<GroupInfo> getGroupList(GroupRequestArgs requestArgs) {
return Unirest.get(javarushApiGroupPath)
.queryString(requestArgs.populateQueries())
.asObject(new GenericType<list<GroupInfo>>() {
})
.getBody();
}
@Override
public List<GroupDiscussionInfo> getGroupDiscussionList(GroupRequestArgs requestArgs) {
return Unirest.get(javarushApiGroupPath)
.queryString(requestArgs.populateQueries())
.asObject(new GenericType<list<GroupDiscussionInfo>>() {
})
.getBody();
}
@Override
public Integer getGroupCount(GroupsCountRequestArgs countRequestArgs) {
return Integer.valueOf(
Unirest.get(String.format("%s/count", javarushApiGroupPath))
.queryString(countRequestArgs.populateQueries())
.asString()
.getBody()
);
}
@Override
public GroupDiscussionInfo getGroupById(Integer id) {
return Unirest.get(String.format("%s/group%s", javarushApiGroupPath, id.toString()))
.asObject(GroupDiscussionInfo.class)
.getBody();
}
}
ฉันเพิ่มเส้นทางไปยัง API ในตัวสร้างโดยใช้คำอธิบายประกอบค่าที่คุ้นเคยอยู่แล้ว โดยบอกเป็นนัยว่าค่าภายในคำอธิบายประกอบสอดคล้องกับฟิลด์ในไฟล์คุณสมบัติ ดังนั้นเรามาเพิ่มบรรทัดใหม่ให้กับ application.properties:
javarush.api.path=https://javarush.com/api/1.0/rest
ตอนนี้ค่านี้จะอยู่ในที่เดียวสำหรับไคลเอ็นต์ API ทั้งหมด และหากเส้นทาง API เปลี่ยนแปลง เราจะอัปเดตอย่างรวดเร็ว ก่อนหน้านี้ ฉันใครก็ตามที่ต้องการลองอัปเดตไลบรารีนี้ - เพิ่มออบเจ็กต์การรับโดยใช้เครื่องมือของไลบรารี unirest เท่านั้น - เขียนในข้อความส่วนตัวหรือเป็นปัญหาใหม่ในไลบรารี นี่จะเป็นประสบการณ์การทำงานที่แท้จริงสำหรับคุณ แต่ฉันไม่รังเกียจ ฉันจะดำเนินการตรวจสอบโค้ดฉบับเต็มและช่วยเหลือหากจำเป็น |
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfoType.TECH;
@DisplayName("Integration-level testing for JavaRushGroupClientImplTest")
class JavaRushGroupClientTest {
private final JavaRushGroupClient groupClient = new JavaRushGroupClientImpl("https://javarush.com/api/1.0/rest");
@Test
public void shouldProperlyGetGroupsWithEmptyArgs() {
//given
GroupRequestArgs args = GroupRequestArgs.builder().build();
//when
List<GroupInfo> groupList = groupClient.getGroupList(args);
//then
Assertions.assertNotNull(groupList);
Assertions.assertFalse(groupList.isEmpty());
}
@Test
public void shouldProperlyGetWithOffSetAndLimit() {
//given
GroupRequestArgs args = GroupRequestArgs.builder()
.offset(1)
.limit(3)
.build();
//when
List<GroupInfo> groupList = groupClient.getGroupList(args);
//then
Assertions.assertNotNull(groupList);
Assertions.assertEquals(3, groupList.size());
}
@Test
public void shouldProperlyGetGroupsDiscWithEmptyArgs() {
//given
GroupRequestArgs args = GroupRequestArgs.builder().build();
//when
List<GroupDiscussionInfo> groupList = groupClient.getGroupDiscussionList(args);
//then
Assertions.assertNotNull(groupList);
Assertions.assertFalse(groupList.isEmpty());
}
@Test
public void shouldProperlyGetGroupDiscWithOffSetAndLimit() {
//given
GroupRequestArgs args = GroupRequestArgs.builder()
.offset(1)
.limit(3)
.build();
//when
List<GroupDiscussionInfo> groupList = groupClient.getGroupDiscussionList(args);
//then
Assertions.assertNotNull(groupList);
Assertions.assertEquals(3, groupList.size());
}
@Test
public void shouldProperlyGetGroupCount() {
//given
GroupsCountRequestArgs args = GroupsCountRequestArgs.builder().build();
//when
Integer groupCount = groupClient.getGroupCount(args);
//then
Assertions.assertEquals(30, groupCount);
}
@Test
public void shouldProperlyGetGroupTECHCount() {
//given
GroupsCountRequestArgs args = GroupsCountRequestArgs.builder()
.type(TECH)
.build();
//when
Integer groupCount = groupClient.getGroupCount(args);
//then
Assertions.assertEquals(7, groupCount);
}
@Test
public void shouldProperlyGetGroupById() {
//given
Integer androidGroupId = 16;
//when
GroupDiscussionInfo groupById = groupClient.getGroupById(androidGroupId);
//then
Assertions.assertNotNull(groupById);
Assertions.assertEquals(16, groupById.getId());
Assertions.assertEquals(TECH, groupById.getType());
Assertions.assertEquals("android", groupById.getKey());
}
}
การทดสอบจะเขียนในลักษณะเดียวกับเมื่อก่อน มีการทดสอบหลายครั้งสำหรับแต่ละคำขอ ไม่มีประโยชน์ที่จะทดสอบทุกอย่าง เนื่องจากฉันคิดว่า API นี้ได้รับการทดสอบในวิธีที่ดีที่สุดแล้ว
บทสรุป
ในส่วนหนึ่งของบทความนี้ เราได้เพิ่มไคลเอ็นต์ Java สำหรับกลุ่มลงใน JavaRush API อย่างที่พวกเขาพูด จงใช้ชีวิตและเรียนรู้ ในขณะที่ฉันกำลังเขียนไคลเอนต์รายนี้ ฉันใช้ประโยชน์จากเอกสารของพวกเขาและใช้งานกับออบเจ็กต์ที่พวกเขาให้มาได้อย่างสะดวก ฉันดึงความสนใจของคุณไปที่งานที่ฉันเสนอ ถ้าใครสนใจก็ส่งข้อความส่วนตัวมาหาผมได้เลย รับรองว่าจะเป็นประสบการณ์ที่น่าสนใจมาก นี่เป็นส่วนแรก ในส่วนที่สอง เราจะใช้คำสั่งเพิ่มโดยตรง และ (หากเราใส่ลงในบทความเดียว) เราจะเพิ่มการรับรายชื่อกลุ่มที่ผู้ใช้สมัครสมาชิก ต่อไป ใครก็ตามที่มีความปรารถนาและความสามารถในการเขียนข้อความให้กับบอท โปรดเขียนถึงฉันทาง PM ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้ และความช่วยเหลือใดๆ จะเป็นประโยชน์มาก มาทำให้ทั้งหมดนี้เป็นทางการเป็นการพัฒนาโอเพ่นซอร์สมันจะน่าสนใจ! ตามปกติ -ลิงค์ที่เป็นประโยชน์ |
---|
|
GO TO FULL VERSION