Retrofit 2 ลบอักขระหลังชื่อโฮสต์ออกจาก URL พื้นฐาน


122

ฉันใช้ Retrofit เพื่อเข้าถึง RESTful api URL ฐานคือ:

http://api.example.com/service

นี่คือรหัสสำหรับอินเทอร์เฟซ:

public interface ExampleService {
    @Headers("Accept: Application/JSON")
    @POST("/album/featured-albums")
    Call<List<Album>> listFeaturedAlbums();
}

และนี่คือวิธีที่ฉันส่งคำขอและรับการตอบกลับ:

new AsyncTask<Void, Void, Response<List<Album>>>() {

        @Override
        protected Response<List<Album>> doInBackground(Void... params) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.example.com/service")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

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

            try {
                return service.listFeaturedAlbums().execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Response<List<Album>> listCall) {
            Log.v("Example", listCall.raw().toString());
        }
    }.execute();

บันทึกที่ฉันได้รับเป็นเรื่องแปลก:

V / ตัวอย่าง﹕ การตอบกลับ {protocol = http / 1.1, code = 404, message = Not Found, url = http://api.example.com/album/featured-albums }

เกิดอะไรขึ้นที่นี่?


คุณช่วยแก้ปัญหาได้ไหม เนื่องจากฉันกำลังเผชิญกับปัญหาเดียวกัน และแม้ว่าฉันจะลองคำตอบที่ถูกต้องฉันก็มักจะล้มเหลวเสมอ
Parth Anjaria

คำตอบ:


283

Retrofit 2 ใช้กฎเดียวกันกับที่<a href="">จะ

ส่วนนำ/บน URL สัมพัทธ์ของคุณบอก Retrofit ว่าเป็นพา ธ สัมบูรณ์บนโฮสต์ นี่คือตัวอย่างจากงานนำเสนอที่ฉันให้ไว้โดยแสดงสิ่งนี้:

ใส่คำอธิบายภาพที่นี่

สังเกต URL ที่ไม่ถูกต้องซึ่งได้รับการแก้ไขที่ด้านล่าง

เมื่อลบส่วนนำ/หน้า URL จะกลายเป็นสัมพัทธ์และจะรวมกับส่วนเส้นทางซึ่งเป็นส่วนหนึ่งของ URL พื้นฐาน แก้ไขในการนำเสนอ URL สุดท้ายถูกต้องแล้ว:

ใส่คำอธิบายภาพที่นี่

ในตัวอย่างของคุณคุณไม่มีการต่อท้าย/URL พื้นฐาน คุณอาจต้องการเพิ่มหนึ่งเพื่อให้เส้นทางสัมพัทธ์ได้รับการแก้ไขด้านบนแทนที่จะเป็นพี่น้องกัน


12
ฉันไม่เข้าใจจริงๆว่าทำไมการแก้ปัญหา URL ประเภทใหม่นี้จึงมีประโยชน์มากกว่า สิ่งที่คุณจะได้รับจากข้อผิดพลาดที่ซ่อนอยู่ (เช่นที่ระบุโดยคำถามนี้) และผลลัพธ์ที่ตอบโต้ได้ง่าย ( http://api.example.com/service+ /album/featured-albumsไม่ใช่http://api.example.com/album/featured-albums) และข้อผิดพลาดที่ไม่มีการโต้ตอบนี้เกิดจากอะไร แต่ไม่ว่าคุณจะวาง/ที่ท้าย URL ฐานหรือที่ด้านหน้าของ URL API มีกรณีการใช้งานใดบ้างที่การตัดทอนนี้มีประโยชน์?
EpicPandaForce


11
มันสมเหตุสมผลสำหรับฉันหลังจากดูงานนำเสนอ แต่จะเป็นการดีที่จะเพิ่มบันทึกย่อเล็ก ๆ ในเว็บไซต์ ฉันใช้เวลาหลายนาทีในการค้นหาว่าเกิดอะไรขึ้น
Albert Vila Calvo

8
@JakeWharton ฉันจะ@POSTไปbaseUrl(โดยไม่ต้องเพิ่มใด ๆpathSegmentหรือไม่ตัวอย่าง: baseUrlเป็นhttp://api.example.com/album/featured-albumsและฉันต้องการของฉัน@POSTเรียกร้องให้ไปhttp://api.example.com/album/featured-albums. (URL เดียวกันเป็นฐาน) @POST("") พ่นjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
ใช้@Post(".")
Jake Wharton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.