रेट्रोफिट एक Converter.Factory
सार वर्ग है कि आप करने के लिए उपयोग कर सकते हैं में मदद मिलेगी कस्टम HTTP प्रतिनिधित्व करते हैं। यदि विधि में एक विशिष्ट एनोटेशन है तो आप okhttp.RequestBody
बनाने के लिए कनवर्टर बना सकते हैं।
अंतिम परिणाम तरह दिखेगा:
@POST("/")
Call<Void> postBar(@Body @Root("bar") String foo)
और परिणत: postBar("Hello World")
{ "bar" : "Hello World" }
में।
चलो शुरू करें।
चरण 1 - जड़ कुंजी (Root.java)
/**
* Denotes the root key of a JSON request.
* <p>
* Simple Example:
* <pre><code>
* @POST("/")
* Call<ResponseBody> example(
* @Root("name") String yourName);
* </code></pre>
* Calling with {@code foo.example("Bob")} yields a request body of
* <code>{name=>"Bob"}</code>.
* @see JSONConverterFactory
*/
@Documented
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface Root {
/**
* The value of the JSON root.
* Results in {"value" : object}
*/
String value();
}
चरण 2 के लिए एक एनोटेशन बना सकते हैं - अपने Converter.Factory कि एनोटेशन (JSONConverterFactory.java) का पता लगाता है परिभाषित करते हैं। मैं JSON पार्सिंग के लिए Gson का उपयोग कर रहा हूं लेकिन आप जो भी ढांचा चाहते हैं उसका उपयोग कर सकते हैं।
/**
* Converts @Root("key") Value to {"key":json value} using the provided Gson converter.
*/
class JSONConverterFactory extends Converter.Factory {
private final Gson gson;
private static final MediaType CONTENT_TYPE =
MediaType.parse("application/json");
JSONConverterFactory(Gson gson) {
this.gson = gson;
}
@Override
public Converter<?, RequestBody> requestBodyConverter(
Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
for (Annotation annotation : parameterAnnotations) {
if (annotation instanceof Root) {
Root rootAnnotation = (Root) annotation;
return new JSONRootConverter<>(gson, rootAnnotation.value());
}
}
return null;
}
private final class JSONRootConverter<T> implements Converter<T, RequestBody> {
private Gson gson;
private String rootKey;
private JSONRootConverter(Gson gson, String rootKey) {
this.gson = gson;
this.rootKey = rootKey;
}
@Override
public RequestBody convert(T value) throws IOException {
JsonElement element = gson.toJsonTree(value);
JsonObject object = new JsonObject();
object.add(this.rootKey, element);
return RequestBody.create(CONTENT_TYPE, this.gson.toJson(object));
}
}
}
चरण 3 - अपने रेट्रोफिट उदाहरण
Gson gson = new GsonBuilder().create(); // Or your customized version
Retrofit.Builder builder = ...;
builder.addConverterFactory(new JSONConverterFactory(gson))
चरण में JSONConverterFactory स्थापित 4 - लाभ
@POST("/")
Call<Void> postBar(@Body @Root("bar") String foo)
या अपने मामले के लिए:
@POST("foo/{fooId}/bars")
Observable<Void> postBar(@Body @Root("bar") String barValue, @Path("fooId") String styleId);
भी देखें इस [मेटा-चर्चा] (http://meta.stackoverflow.com/q/327487/230513) में मानचित्र बदल जाएगा। – trashgod