คำถามติดแท็ก retrofit

Retrofit เป็นไคลเอนต์ REST ประเภทปลอดภัยสำหรับ Android และ Java โดย Square, Inc.

10
การเปรียบเทียบไลบรารีเครือข่าย Android: OkHTTP, Retrofit และ Volley [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน3 ปีที่ผ่านมา คำถามสองส่วนจากนักพัฒนา iOS ที่กำลังเรียนรู้ Android ซึ่งทำงานในโครงการ Android ที่จะทำการร้องขอที่หลากหลายจาก JSON เป็นรูปภาพเพื่อสตรีมมิ่งการดาวน์โหลดเสียงและวิดีโอ: บน iOS ฉันใช้โครงการเครือข่าย AFNอย่างกว้างขวาง มีห้องสมุดที่เทียบเท่าสำหรับ Android? ฉันได้อ่านOkHTTPและRetrofit by Square และVolley แล้วแต่ยังไม่มีประสบการณ์ในการพัฒนา ฉันหวังว่าบางคนสามารถให้ตัวอย่างที่ชัดเจนของกรณีการใช้ที่ดีที่สุดสำหรับแต่ละคน จากสิ่งที่ฉันได้อ่านดูเหมือนว่า OkHTTP จะแข็งแกร่งที่สุดในบรรดาสามประการและสามารถจัดการกับข้อกำหนดของโครงการนี้ได้ (ดังที่ได้กล่าวไว้ข้างต้น)

21
การบันทึกด้วยชุดติดตั้งเพิ่มเติม 2
ฉันพยายามรับ JSON ที่ถูกต้องในการส่งคำขอ นี่คือรหัสของฉัน: OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor(){ @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Log.e(String.format("\nrequest:\n%s\nheaders:\n%s", request.body().toString(), request.headers())); com.squareup.okhttp.Response response = chain.proceed(request); return response; } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client).build(); แต่ฉันเห็นเฉพาะในบันทึก: request: com.squareup.okhttp.RequestBody$1@3ff4074d headers: Content-Type: application/vnd.ll.event.list+json ฉันควรจะทำการบันทึกที่เหมาะสมได้อย่างไรเมื่อทำการลบsetLog()และsetLogLevel()ที่เราเคยใช้กับ Retrofit …

21
วิธีการโพสต์ดิบ JSON ทั้งหมดในเนื้อความของคำขอการติดตั้งเพิ่ม?
อาจมีการถามคำถามนี้ก่อนหน้านี้ แต่ไม่ได้รับคำตอบอย่างชัดเจน หนึ่งโพสต์ดิบทั้งหมดของ JSON ภายในเนื้อความของคำขอการติดตั้งเพิ่มยังไง? ดูคำถามที่คล้ายกันที่นี่ หรือเป็นคำตอบที่ถูกต้องนี้ว่ามันจะต้องมีรูปแบบเข้ารหัส URL และผ่านการเป็นเขตข้อมูล ? ฉันหวังว่าจะไม่จริง ๆ เพราะบริการที่ฉันกำลังเชื่อมต่ออยู่นั้นคาดหวังว่าจะมี JSON แบบดิบในเนื้อหาของโพสต์ พวกเขาไม่ได้ตั้งค่าให้ค้นหาเขตข้อมูลเฉพาะสำหรับข้อมูล JSON ฉันแค่อยากจะอธิบายเรื่องนี้ให้ฟังด้วยซ้ำทุกครั้ง มีคนหนึ่งตอบว่าไม่ต้องใช้ชุดติดตั้งเพิ่ม อื่น ๆ ไม่แน่ใจของไวยากรณ์ อีกคนคิดว่าใช่มันสามารถทำได้ แต่เฉพาะเมื่อมีการเข้ารหัสรูปแบบ URL และวางในฟิลด์ (นั่นไม่ใช่กรณีที่ฉันยอมรับ) ไม่ฉันไม่สามารถกำหนดรหัสบริการทั้งหมดใหม่สำหรับไคลเอนต์ Android ของฉันได้ และใช่มันเป็นเรื่องธรรมดามากในโครงการสำคัญ ๆ ที่จะโพสต์ JSON แบบ raw แทนที่จะส่งผ่านเนื้อหา JSON เป็นค่าคุณสมบัติของฟิลด์ มาทำให้ถูกต้องแล้วเดินต่อไป บางคนสามารถชี้ไปที่เอกสารหรือตัวอย่างที่แสดงวิธีการนี้ได้หรือไม่ หรือระบุเหตุผลที่ถูกต้องว่าทำไมจึงไม่สามารถทำได้ / ไม่ควรทำ ปรับปรุง: สิ่งหนึ่งที่ฉันสามารถพูดได้อย่างมั่นใจ 100% คุณสามารถทำได้ในวอลเลย์ของ Google มันถูกสร้างขึ้นมาเราสามารถทำสิ่งนี้ใน …

9
เมื่อใดที่ควรใช้ RxJava Observable และเมื่อโทรกลับอย่างง่ายบน Android
ฉันกำลังทำงานกับเครือข่ายสำหรับแอปของฉัน ดังนั้นผมจึงตัดสินใจที่จะลองของจัตุรัสติดตั้งเพิ่ม ฉันเห็นว่าพวกเขาสนับสนุนเรียบง่ายCallback @GET("/user/{id}/photo") void getUserPhoto(@Path("id") int id, Callback<Photo> cb); และ RxJava's Observable @GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id); ทั้งคู่ดูคล้ายกันตั้งแต่แรกเห็น แต่เมื่อนำไปใช้งานมันน่าสนใจ ... ในขณะที่การใช้งานการโทรกลับง่ายจะมีลักษณะคล้ายกับนี้ api.getUserPhoto(photoId, new Callback<Photo>() { @Override public void onSuccess() { } }); ซึ่งค่อนข้างง่ายและตรงไปตรงมา และด้วยObservableอย่างรวดเร็วได้รับ verbose และค่อนข้างซับซ้อน public Observable<Photo> getUserPhoto(final int photoId) { return Observable.create(new Observable.OnSubscribeFunc<Photo>() { @Override public Subscription …

10
ชุดติดตั้งเพิ่มเติม 2 - URL แบบไดนามิก
ด้วย Retrofit 2 คุณสามารถตั้งค่า URL แบบเต็มในหมายเหตุประกอบของวิธีการบริการเช่น: public interface APIService { @GET("http://api.mysite.com/user/list") Call<Users> getUsers(); } อย่างไรก็ตามในแอพของฉัน URL ของเว็บเซอร์ของฉันไม่เป็นที่รู้จักในเวลารวบรวมแอพจะเรียกคืนพวกเขาในไฟล์ที่ดาวน์โหลดดังนั้นฉันสงสัยว่าฉันจะใช้ Retrofit 2 กับ URL แบบไดนามิกได้อย่างไร ฉันพยายามตั้งเส้นทางแบบเต็มเช่น: public interface APIService { @GET("{fullUrl}") Call<Users> getUsers(@Path("fullUrl") fullUrl); } new Retrofit.Builder() .baseUrl("http://api.mysite.com/") .build() .create(APIService.class) .getUsers("http://api.mysite.com/user/list"); // this url should be dynamic .execute(); แต่ที่นี่ Retrofit ไม่เห็นว่าเส้นทางนั้นเป็น URL แบบเต็มและพยายามดาวน์โหลด …
181 android  retrofit 

9
วิธีการตั้งค่าการหมดเวลาในไลบรารีชุดติดตั้งเพิ่มเติม
ฉันใช้ห้องสมุดชุดติดตั้งเพิ่มเติมในแอพของฉันและฉันต้องการตั้งค่าการหมดเวลา 60 วินาที ชุดติดตั้งเพิ่มเติมมีวิธีการทำเช่นนี้หรือไม่? ฉันตั้งค่าติดตั้งเพิ่มเติมด้วยวิธีนี้: RestAdapter restAdapter = new RestAdapter.Builder() .setServer(BuildConfig.BASE_URL) .setConverter(new GsonConverter(gson)) .build(); ฉันจะตั้งค่าการหมดเวลาได้อย่างไร

9
การรีเฟรชโทเค็น OAuth โดยใช้ชุดติดตั้งเพิ่มเติมโดยไม่แก้ไขการโทรทั้งหมด
เรากำลังใช้ Retrofit ในแอพ Android ของเราเพื่อสื่อสารกับเซิร์ฟเวอร์ที่ปลอดภัย OAuth2 ทุกอย่างใช้งานได้ดีเราใช้ RequestInterceptor เพื่อรวมโทเค็นการเข้าถึงกับการโทรแต่ละครั้ง อย่างไรก็ตามจะมีบางครั้งที่โทเค็นการเข้าถึงจะหมดอายุและโทเค็นจะต้องมีการรีเฟรช เมื่อโทเค็นหมดอายุการโทรครั้งต่อไปจะกลับมาพร้อมรหัส HTTP ที่ไม่ได้รับอนุญาตดังนั้นจึงง่ายต่อการตรวจสอบ เราสามารถแก้ไขการโทรติดตั้งเพิ่มเติมแต่ละครั้งด้วยวิธีต่อไปนี้: ในการโทรกลับล้มเหลวให้ตรวจสอบรหัสข้อผิดพลาดหากเท่ากับไม่ได้รับอนุญาตให้รีเฟรชโทเค็น OAuth จากนั้นทำซ้ำการโทรติดตั้งเพิ่มเติม อย่างไรก็ตามสำหรับสิ่งนี้การโทรทั้งหมดควรได้รับการแก้ไขซึ่งไม่สามารถบำรุงรักษาได้ง่ายและเป็นทางออกที่ดี มีวิธีการทำเช่นนี้หรือไม่โดยไม่แก้ไขการโทรติดตั้งเพิ่มทั้งหมดหรือไม่

6
สามารถติดตั้งเพิ่มด้วย OKHttp ใช้ข้อมูลแคชเมื่อออฟไลน์
ฉันพยายามใช้ Retrofit & OKHttp เพื่อแคชการตอบกลับ HTTP ฉันติดตามกระทู้นี้และลงเอยด้วยรหัสนี้: File httpCacheDirectory = new File(context.getCacheDir(), "responses"); HttpResponseCache httpResponseCache = null; try { httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024 * 1024); } catch (IOException e) { Log.e("Retrofit", "Could not create http cache", e); } OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setResponseCache(httpResponseCache); api = new …

10
POST Multipart Data Data โดยใช้ Retrofit 2.0 รวมถึงรูปภาพ
ฉันพยายามทำ HTTP POST ไปยังเซิร์ฟเวอร์โดยใช้Retrofit 2.0 MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain"); MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream); profilePictureByte = byteArrayOutputStream.toByteArray(); Call<APIResults> call = ServiceAPI.updateProfile( RequestBody.create(MEDIA_TYPE_TEXT, emailString), RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte)); call.enqueue(); เซิร์ฟเวอร์ส่งคืนข้อผิดพลาดที่แจ้งว่าไฟล์ไม่ถูกต้อง นี่เป็นเรื่องแปลกเพราะฉันพยายามอัปโหลดไฟล์เดียวกันด้วยรูปแบบเดียวกันบน iOS (ใช้ไลบรารีอื่น) แต่อัปโหลดสำเร็จ ฉันสงสัยว่าวิธีที่เหมาะสมในการอัพโหลดภาพโดยใช้Retrofit 2.0คืออะไร ฉันควรบันทึกลงดิสก์ก่อนอัพโหลดหรือไม่ PS: ฉันได้ใช้ชุดติดตั้งเพิ่มสำหรับการร้องขอ Multipart อื่น ๆ ที่ไม่รวมภาพและพวกเขาเสร็จสมบูรณ์ ปัญหาคือเมื่อฉันพยายามที่จะรวมไบต์กับร่างกาย

21
Retrofit 2.0 วิธีรับการตอบสนองข้อผิดพลาด deserialised ร่างกาย
ฉันใช้Retrofit 2.0.0-beta1 ในการทดสอบฉันมีสถานการณ์อื่นและคาดว่าจะเกิดข้อผิดพลาด HTTP 400 ฉันอยากจะมีretrofit.Response<MyError> response แต่response.body() == null MyError ไม่ได้ถูก deserialised - ฉันเห็นที่นี่เท่านั้น response.errorBody().string() แต่มันไม่ได้ให้ MyError เป็นวัตถุ
132 java  retrofit  retrofit2 

10
ไม่สามารถสร้างตัวแปลงสำหรับชั้นเรียนของฉันในห้องสมุด Android Retrofit
ฉันย้ายจากการใช้ Volley เป็น Retrofit ฉันมีคลาส gson ที่ฉันใช้มาก่อนสำหรับการแปลง JSONObject reponse เป็นวัตถุที่ใช้การเพิ่มความคิดเห็น gson เมื่อฉันพยายามที่จะทำให้ http ได้รับคำขอโดยใช้ชุดติดตั้งเพิ่ม แต่แอปของฉันล้มเหลวด้วยข้อผิดพลาดนี้: Unable to start activity ComponentInfo{com.lightbulb.pawesome/com.example.sample.retrofit.SampleActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.lightbulb.pawesome.model.Pet for method GitHubService.getResponse ฉันทำตามคำแนะนำในไซต์ติดตั้งเพิ่มเติมและฉันได้พบกับการใช้งานเหล่านี้: นี่คือกิจกรรมของฉันที่ฉันพยายามเรียกใช้คำขอ http ย้อนยุค: public class SampleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sample); Retrofit …
130 android  gson  retrofit 

10
การเพิ่มส่วนหัวของคำขอทั้งหมดด้วย Retrofit 2
เอกสารประกอบของ Retrofit 2 ระบุว่า: ส่วนหัวที่ต้องเพิ่มให้กับทุกคำขอสามารถระบุได้โดยใช้ตัวสกัดกั้น OkHttp สามารถทำได้อย่างง่ายดายโดยใช้เวอร์ชันก่อนหน้านี่คือ QA ที่เกี่ยวข้อง แต่เมื่อใช้ชุดติดตั้งเพิ่ม 2 ฉันไม่พบสิ่งที่เหมือนsetRequestInterceptorหรือsetInterceptorวิธีที่สามารถใช้กับRetrofit.Builderวัตถุได้ ดูเหมือนว่าไม่มีRequestInterceptorในOkHttpอีกต่อไป เอกสารของ Retrofit อ้างถึงInterceptorซึ่งฉันไม่ค่อยเข้าใจวิธีใช้เพื่อจุดประสงค์นี้ ฉันจะทำเช่นนี้ได้อย่างไร?

9
จะบันทึกคำขอและเนื้อหาตอบกลับด้วย Retrofit-Android ได้อย่างไร
ฉันไม่พบวิธีการที่เกี่ยวข้องใน Retrofit API สำหรับการบันทึกเนื้อหาคำขอ / การตอบกลับที่สมบูรณ์ ฉันคาดหวังความช่วยเหลือบางอย่างใน Profiler (แต่มีเฉพาะข้อมูลเมตาเกี่ยวกับการตอบสนองเท่านั้น) ฉันพยายามตั้งค่าระดับการบันทึกใน Builder แต่ก็ไม่ได้ช่วยฉันเช่นกัน: RestAdapter adapter = (new RestAdapter.Builder()). setEndpoint(baseUrl). setRequestInterceptor(interceptor). setProfiler(profiler). setClient(client). setExecutors(MyApplication.getWebServiceThreadPool()). setLogLevel(LogLevel.FULL). setLog(new RestAdapter.Log() { @Override public void log(String msg) { Log.i(TAG, msg); } }). build(); แก้ไข: รหัสนี้ใช้งานได้แล้ว ฉันไม่รู้ว่าทำไมมันถึงไม่ทำงานก่อนหน้านี้ อาจเป็นเพราะฉันใช้ชุดติดตั้งรุ่นเก่าบางรุ่น

4
ฉันจะจัดการกับตัวตอบสนองที่ว่างเปล่าด้วย Retrofit 2 ได้อย่างไร
เมื่อเร็ว ๆ นี้ฉันเริ่มใช้ Retrofit 2 และฉันประสบปัญหาในการแยกวิเคราะห์เนื้อหาตอบสนองที่ว่างเปล่า ฉันมีเซิร์ฟเวอร์ที่ตอบสนองด้วยโค้ด http เท่านั้นโดยไม่มีเนื้อหาใด ๆ ในเนื้อหาตอบกลับ ฉันจะจัดการเฉพาะข้อมูลเมตาเกี่ยวกับการตอบสนองของเซิร์ฟเวอร์ (ส่วนหัวรหัสสถานะ ฯลฯ ) ได้อย่างไร

1
Retrofit 2 ลบอักขระหลังชื่อโฮสต์ออกจาก URL พื้นฐาน
ฉันใช้ 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 …
122 android  retrofit 

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