কীভাবে পুরো জেএসনকে একটি পুনঃনির্দেশ অনুরোধের শৃঙ্খলে পোস্ট করবেন?


284

এই প্রশ্নটি আগে জিজ্ঞাসা করা হতে পারে তবে এটির সুনির্দিষ্ট উত্তর দেওয়া হয়নি। কোনও পোস্ট কীভাবে পুরো জেএসওনকে একটি retrofit অনুরোধের শরীরে ভিতরে দেয়?

অনুরূপ প্রশ্ন এখানে দেখুন । অথবা এই উত্তরটি সঠিক যে এটি অবশ্যই url এনকোডযুক্ত এবং ক্ষেত্র হিসাবে পাস করতে হবে ? আমি সত্যিই আশা করি না, যে পরিষেবাগুলির সাথে আমি সংযোগ দিচ্ছি কেবল পোস্টের শিরোনামে কাঁচা জেএসএন আশা করে। তারা JSON ডেটার জন্য কোনও নির্দিষ্ট ক্ষেত্র সন্ধানের জন্য সেট আপ করা হয়নি।

আমি কেবল একবার এবং সকলের জন্য বিশ্রামাগারগুলির সাথে এটি স্পষ্ট করতে চাই । এক ব্যক্তি রেট্রোফিট ব্যবহার না করার জবাব দিয়েছে। অন্যটি সিনট্যাক্স সম্পর্কে নিশ্চিত ছিল না। অন্যজন হ্যাঁ এটি করা যেতে পারে বলে মনে করে তবে কেবল যদি এর ফর্মটি ইউআরএলড থাকে এবং একটি ক্ষেত্রের মধ্যে রাখে (এটি আমার ক্ষেত্রে গ্রহণযোগ্য নয়)। না, আমি আমার অ্যান্ড্রয়েড ক্লায়েন্টের জন্য সমস্ত পরিষেবা পুনরায় কোড করতে পারি না। এবং হ্যাঁ, বড় প্রকল্পগুলিতে ক্ষেত্রের সম্পত্তির মান হিসাবে JSON বিষয়বস্তু অতিক্রম করার পরিবর্তে কাঁচা JSON পোস্ট করা খুব সাধারণ। আসুন এটি ডান পেতে এবং এগিয়ে যান। কেউ কি ডকুমেন্টেশন বা উদাহরণের দিকে ইঙ্গিত করতে পারে যা দেখায় যে এটি কীভাবে হয়? অথবা এটি কেন করা / করা উচিত নয় তার একটি বৈধ কারণ সরবরাহ করুন।

আপডেট: একটি জিনিস আমি 100% নিশ্চিততার সাথে বলতে পারি। আপনি গুগলের ভলিতে এটি করতে পারেন। এটি ঠিক এখনই তৈরি করা হয়েছে r আমরা কি এটি retrofit এ করতে পারি?


7
জ্যাক ওয়ার্টনের পোস্টটি সঠিক! উত্তর হিসাবে চিহ্নিত করুন!
এডোটাসি

1
আপনি jsonObject আরও ভাল ব্যবহার করতে পারেন।
ইউজার

ভবিষ্যতের স্টুডিয়ো.টিউটোরিয়ালসRequestBodyRequestBody body = RequestBody.create(MediaType.parse("text/plain"), text);
কিডস টেকস্ট

উত্তর:


461

@Bodyটীকা একটি একক অনুরোধের মূল সংজ্ঞায়িত করে।

interface Foo {
  @POST("/jayson")
  FooResponse postJson(@Body FooRequest body);
}

যেহেতু রেট্রোফিট গসনকে ডিফল্টরূপে ব্যবহার করে, তাই FooRequestউদাহরণগুলির অনুরোধের একমাত্র শরীর হিসাবে জেএসএন হিসাবে ক্রমিক করা হবে।

public class FooRequest {
  final String foo;
  final String bar;

  FooRequest(String foo, String bar) {
    this.foo = foo;
    this.bar = bar;
  }
}

সাথে কল করা:

FooResponse = foo.postJson(new FooRequest("kit", "kat"));

নিম্নলিখিত শরীরের উত্পাদন করবে:

{"foo":"kit","bar":"kat"}

Gson ডক্স কিভাবে বস্তুর ধারাবাহিকতাতে কাজ করে অনেক বেশি আছে।

এখন, আপনি যদি সত্যিই দেহ হিসাবে "কাঁচা" জেএসএন প্রেরণ করতে চান তবে (তবে দয়া করে এর জন্য জিসন ব্যবহার করুন!) আপনি এখনও ব্যবহার করতে পারেন TypedInput:

interface Foo {
  @POST("/jayson")
  FooResponse postRawJson(@Body TypedInput body);
}

টাইপড ইনপুট একটি সংযুক্ত মাইম টাইপের সাথে বাইনারি ডেটা হিসাবে সংজ্ঞায়িত। উপরোক্ত ঘোষণার সাথে কাঁচা ডেটা সহজেই প্রেরণের দুটি উপায় রয়েছে:

  1. কাঁচা বাইট এবং JSON মাইম প্রকারটি প্রেরণে টাইপডবাইটআর্রে ব্যবহার করুন :

    String json = "{\"foo\":\"kit\",\"bar\":\"kat\"}";
    TypedInput in = new TypedByteArray("application/json", json.getBytes("UTF-8"));
    FooResponse response = foo.postRawJson(in);
  2. একটি শ্রেণি তৈরি করতে সাবক্লাস টাইপড স্ট্রিংTypedJsonString :

    public class TypedJsonString extends TypedString {
      public TypedJsonString(String body) {
        super(body);
      }
    
      @Override public String mimeType() {
        return "application/json";
      }
    }

    এবং তারপরে # 1 এর মতো ক্লাসের একটি উদাহরণ ব্যবহার করুন।


5
খুব ভাল, তবে, পোজো তৈরি না করে এটি করার কোনও উপায় আছে কি?
ইউজার

28
এটি retrofit 2 এ কাজ করছে না টাইপড ইনপুট এবং টাইপড্রিং ক্লাসগুলি সরানো হয়েছিল।
আহমেদ হেগজি

2
@ জেকাওয়ার্টন TypedStringএটি অপসারণের পর থেকে আমরা কী করতে পারি ?
জ্যারেড বুরোজ

12
Retrofit2 এর জন্য, আপনি RequestBodyএকটি কাঁচা বডি তৈরি করতে ব্যবহার করতে পারেন ।
জন্ম

4
আমি এই ব্যতিক্রমটি java.lang.IllegalArgumentException: Unable to create @Body converter for class MatchAPIRequestBody (parameter #1)
পাচ্ছি

154

ক্লাসগুলির পরিবর্তে আমরা HashMap<String, Object>উদাহরণস্বরূপ বডি প্যারামিটারগুলি প্রেরণে সরাসরি ব্যবহার করতে পারি

interface Foo {
  @POST("/jayson")
  FooResponse postJson(@Body HashMap<String, Object> body);
}

2
সেই সময় আপনি হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট> এর মতো হ্যাশ মানচিত্র তৈরি করতে পারেন, কিন্ডা জটিল অ্যারে এবং অবজেক্ট জেএসওএন তৈরি করা সম্ভব।
শিক্ষার্থী

2
আপনি যদি কোনও প্রকারের পোজোর সাথে বাঁধা না রাখতে চান তবে এটি দুর্দান্ত।
টিম

2
@ না আপনি রেট্রোফিট ব্যবহার করে জসন অবজেক্টটি প্রেরণ করতে পারবেন না ... আপনি পোজো বা আমার উত্তরটির সাথে মেনে চলেন ... এটি প্রাকৃতিক বৈশিষ্ট্য if যদি আপনি এই বিষয়ে আরও জানতে চান জ্যাক ওয়ার্টন তিনি পুনঃপ্রতিষ্ঠিত বিকাশকারী লোক, তার উত্তরও পোজোর সাথে উপলব্ধ ।
শিক্ষার্থী

5
আমি IllegalArgumentException: Unable to create @Body converter for java.util.HashMap<java.lang.String, java.lang.Object>মোশির সাথে আছি । আমি মনে করি Gson কাজ এই জন্য প্রয়োজন হয়
osrl

2
কোটলিন ব্যবহার করে <স্ট্রিং, যে কোনও>
পেরেসিসউসার

148

হ্যাঁ আমি জানি এটি দেরী হয়ে গেছে তবে কেউ কেউ সম্ভবত এটি থেকে উপকৃত হবেন।

Retrofit2 ব্যবহার:

আমি ভলি থেকে Retrofit2 মাইগ্রেট (এবং ও.পি. যুক্তরাষ্ট্রের মতো, এই অধিকার দিয়ে গোল মধ্যে নির্মিত হয়েছিল গত রাতে এই সমস্যা জুড়ে এসেছিল JsonObjectRequest), এবং যদিও জেক এর উত্তর Retrofit1.9 জন্য সঠিক অন্যতম , Retrofit2 নেই TypedString

আমার ক্ষেত্রে Map<String,Object>এমন একটি প্রেরণ দরকার যা কিছু নাল মান ধারণ করতে পারে, জেএসওএনজেক্টে রূপান্তরিত হয়েছিল (এটি দিয়ে উড়বে @FieldMapনা, বিশেষ চরগুলিও নয় , কেউ কেউ রূপান্তরিত হয় না), সুতরাং @ বর্নামের ইঙ্গিত অনুসরণ করে এবং স্কয়ার দ্বারা বর্ণিত :

@ বডি টীকা সহ কোনও HTTP অনুরোধ সংস্থা হিসাবে ব্যবহারের জন্য একটি বিষয় নির্দিষ্ট করা যেতে পারে।

Retrofit উদাহরণে নির্দিষ্ট রূপান্তরকারী ব্যবহার করে অবজেক্টটিও রূপান্তরিত হবে। যদি কোনও রূপান্তরকারী যুক্ত না হয় তবে কেবলমাত্র অনুরোধবডি ব্যবহার করা যেতে পারে।

সুতরাং এটি ব্যবহার করে একটি বিকল্প RequestBodyএবং ResponseBody:

আপনার ইন্টারফেস ব্যবহারে @Bodyসঙ্গেRequestBody

public interface ServiceApi
{
    @POST("prefix/user/{login}")
    Call<ResponseBody> login(@Path("login") String postfix, @Body RequestBody params);  
}

আপনার কলিং পয়েন্টে RequestBodyএটিকে মিডিয়াটাইপ উল্লেখ করে একটি তৈরি করুন এবং আপনার মানচিত্রকে যথাযথ বিন্যাসে রূপান্তর করতে JSONObject ব্যবহার করুন:

Map<String, Object> jsonParams = new ArrayMap<>();
//put something inside the map, could be null
jsonParams.put("code", some_code);

RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),(new JSONObject(jsonParams)).toString());
//serviceCaller is the interface initialized with retrofit.create...
Call<ResponseBody> response = serviceCaller.login("loginpostfix", body);
      
response.enqueue(new Callback<ResponseBody>()
    {
        @Override
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> rawResponse)
        {
            try
            {
             //get your response....
              Log.d(TAG, "RetroFit2.0 :RetroGetLogin: " + rawResponse.body().string());
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable throwable)
        {
        // other stuff...
        }
    });

আশা করি এটি কাউকে সহায়তা করে!


উপরের একটি মার্জিত কোটলিন সংস্করণ, আপনার বাকী অ্যাপ্লিকেশন কোডে JSON রূপান্তর থেকে প্যারামিটারগুলি বিমূর্ত করার অনুমতি দিতে:

interface ServiceApi {

    fun login(username: String, password: String) =
            jsonLogin(createJsonRequestBody(
                "username" to username, "password" to password))

    @POST("/api/login")
    fun jsonLogin(@Body params: RequestBody): Deferred<LoginResult>

    private fun createJsonRequestBody(vararg params: Pair<String, String>) =
            RequestBody.create(
                okhttp3.MediaType.parse("application/json; charset=utf-8"), 
                JSONObject(mapOf(*params)).toString())

}

2
হ্যাঁ, আমি এর জন্য অনেকগুলি জটিল প্রতিক্রিয়া দেখছি। আপনি যদি retrofit2 ব্যবহার করছেন এবং ভলির কাজ করতে চান JsonObjectRequest, আপনার যা করতে হবে তা হ'ল এটি। ভাল উত্তর.
ভিকভিউ

2
রিট্রোফিট সমস্ত জাসন অবজেক্টের শীর্ষে "নামভ্যালিউপায়ারস" নামের একটি কী যুক্ত করে। আমি এই @ টমিএসএম
nr5

1
ধন্যবাদ! এটি আমার সমস্যার সমাধান করেছে। এখন আমি পোগো তৈরি না করে সরাসরি জেএসএনওবজেক্টটি পাঠাতে পারি।
এরফান জিএলএমপিআর

1
এটিই একমাত্র সমাধান যা আমাকে post a null valueঅনুরোধডুবিতে একটি সম্পত্তিতে সহায়তা করেছিল যা অন্যথায় উপেক্ষা করা হচ্ছে।
শুভ্রাল

আমি জানি আমি দেরি করেছি কিন্তু jsonParams.put("code", some_code);তৃতীয় লাইনে কী আছে?
নবীন নিরাউলা

81

ইন Retrofit2 , আপনি যখন কাঁচা আপনি ব্যবহার করা আবশ্যক আপনার পরামিতি পাঠাতে চান Scalars

প্রথমে এটি আপনার গ্রেডে যুক্ত করুন:

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

আপনার ইন্টারফেস

public interface ApiInterface {

    String URL_BASE = "http://10.157.102.22/rest/";

    @Headers("Content-Type: application/json")
    @POST("login")
    Call<User> getUser(@Body String body);

}

কার্যকলাপ

   public class SampleActivity extends AppCompatActivity implements Callback<User> {

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

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ApiInterface.URL_BASE)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiInterface apiInterface = retrofit.create(ApiInterface.class);


        // prepare call in Retrofit 2.0
        try {
            JSONObject paramObject = new JSONObject();
            paramObject.put("email", "sample@gmail.com");
            paramObject.put("pass", "4384984938943");

            Call<User> userCall = apiInterface.getUser(paramObject.toString());
            userCall.enqueue(this);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onResponse(Call<User> call, Response<User> response) {
    }

    @Override
    public void onFailure(Call<User> call, Throwable t) {
    }
}

10
এখানে কৌশলটি হ'ল জিসনের আগে স্কেলার অ্যাডাপ্টার, অন্যথায় গসন আপনার ম্যানুয়ালি সিরিয়ালযুক্ত জেএসওনকে একটি স্ট্রিংয়ে আবদ্ধ করবে।
TWiStErRob

2
জোনাথন-নোলাসো-ব্যারিয়ন্তো আপনাকে .baseUrl (ApiInterface.endPOINT) থেকে .BaseUrl (ApiInterface. URL_BASE) এ পরিবর্তন করতে হবে
মিলাদ আহমাদি

2
যখন আপনি ব্যবহার GsonConverterFactory, .toString()প্রয়োজন হয় না। আপনি পরিবর্তে Call<User> getUser(@Body JsonObject body);ব্যবহার করে ঘোষণা করতে পারেন এবং সরাসরি পাস করতে পারেন । এটা ঠিক কাজ করবে। JsonObjectJSONObjectparamObject
ইগর ডি লোরেঞ্জি

1
@ ইগর্ডে লরেনজি আমার সমস্যাটি সমাধান করুন, যেহেতু আমি বসন্তের বুটটি ব্যবহার করছি কেবল জসনকে জিএসন থেকে পুনরুদ্ধার করতে জিএসন থেকে জাসনঅবজেক্টটি ভাল কাজ করে
হাইডারভিএম

1
@ ইগার্ডলোরেঞ্জি স্কেলারগুলির সাথে ব্যবহার করার জন্য কোনটি ভাল জাসোনবজেক্ট বা জসনঅবজেক্টের মধ্যে পার্থক্য রয়েছে?
সুমিত শুক্লা

44

ব্যবহার JsonObjectউপায় এটা হয়:

  1. আপনার ইন্টারফেসটি এভাবে তৈরি করুন:

    public interface laInterfaz{ 
        @POST("/bleh/blah/org")
        void registerPayer(@Body JsonObject bean, Callback<JsonObject> callback);
    }
  2. জসনস কাঠামোর সাথে জসনঅবজেক্টকে অ্যাকর্ডিং করুন।

    JsonObject obj = new JsonObject();
    JsonObject payerReg = new JsonObject();
    payerReg.addProperty("crc","aas22");
    payerReg.addProperty("payerDevManufacturer","Samsung");
    obj.add("payerReg",payerReg);
    /*json/*
        {"payerReg":{"crc":"aas22","payerDevManufacturer":"Samsung"}}
    /*json*/
  3. পরিষেবাটি কল করুন:

    service.registerPayer(obj, callBackRegistraPagador);
    
    Callback<JsonObject> callBackRegistraPagador = new Callback<JsonObject>(){
        public void success(JsonObject object, Response response){
            System.out.println(object.toString());
        }
    
        public void failure(RetrofitError retrofitError){
            System.out.println(retrofitError.toString());
        }
    };

এবং এটি তার! আমার ব্যক্তিগত মতে, এটি পজো তৈরি করা এবং ক্লাস গন্ডগোলের সাথে কাজ করার চেয়ে অনেক ভাল। এটি অনেক বেশি ক্লিনার।


1
আমি যদি জসনোবজেক্ট শ্রেণিতে নির্দিষ্ট মান প্রেরণ করতে চাই না তবে কী হবে। এর জন্য আমি কোন উক্তির উপরে যাচাইযোগ্য ব্যবহার করতে পারি?
আলী গেরেলি

1
আপনি উপরের উদাহরণটি দেখতে পাচ্ছেন ... জেসনঅবজেক্ট এটি কোনও বস্তু হিসাবে কোনও বিকাশ ব্যবহার করে না। আপনার ক্ষেত্রে যদি আপনি নির্দিষ্ট মানটি প্রেরণ করতে না চান তবে আপনি সম্ভবত এটি সম্পত্তি হিসাবে যুক্ত না করতে পারেন ...
ইউজার

1
মানে আমি ক্লাসে ঘোষিত মানটি পাঠাতে চাই না। বিটিডব্লিউ আমি সমস্যাটি স্থির করেছি। কোন নামটি প্রকাশ করা হচ্ছে তার জন্য একটি টীকা ছিল।
আলী গেরেলি

2
এটি সবচেয়ে নমনীয় উপায়। আপনার কতটি ক্ষেত্র থাকবে তা আপনি না
জানলেও বা

1
আমি ত্রুটি পেয়েছি পরিষেবার পদ্ধতিগুলি শূন্য করতে পারে না। পদ্ধতির জন্য APIServices.signUpUser
এরম

11

আমি বিশেষত উপরেরTypedString সাবক্লাসের জ্যাকের পরামর্শটি পছন্দ করি । আপনি যে পোষ্ট ডেটা ধাক্কা দেওয়ার পরিকল্পনা করছেন তার উপর ভিত্তি করে আপনি বিভিন্ন ধরণের সাবক্লাস তৈরি করতে পারেন, যার প্রতিটি নিজস্ব কাস্টম সামঞ্জস্যপূর্ণ টুইটের সেট রয়েছে।

আপনার রেট্রোফিট এপিআইতে আপনার জেএসএন পোস্ট পদ্ধতিতে শিরোনাম টীকা যুক্ত করার বিকল্পও রয়েছে ...

@Headers( "Content-Type: application/json" )
@POST("/json/foo/bar/")
Response fubar( @Body TypedString sJsonBody ) ;

… তবে একটি সাবক্লাস ব্যবহার করা আরও স্পষ্টত স্ব-ডকুমেন্টিং।

@POST("/json/foo/bar")
Response fubar( @Body TypedJsonString jsonBody ) ;

1
একটি স্পষ্ট উদাহরণ JW পরামর্শ থেকে TypedJsonString ব্যবহার করে প্রতিদিন সংরক্ষিত
miroslavign

10

1) নির্ভরতা যুক্ত করুন-

 compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

2) এপি হ্যান্ডলারের ক্লাস করুন

    public class ApiHandler {


  public static final String BASE_URL = "URL";  

    private static Webservices apiService;

    public static Webservices getApiService() {

        if (apiService == null) {

           Gson gson = new GsonBuilder()
                    .setLenient()
                    .create();
            Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(gson)).baseUrl(BASE_URL).build();

            apiService = retrofit.create(Webservices.class);
            return apiService;
        } else {
            return apiService;
        }
    }


}

3) জসন স্কিমা 2 পোজো থেকে শিমের ক্লাস তৈরি করুন

মনে রাখবেন-
টার্গেটের ভাষা: জাভা- উত্সের ধরণ: জেএসওএন -অনোটেশন শৈলী: গসন-নির্বাচন করুন গ্রাহকগণ এবং সেটারগুলি অন্তর্ভুক্ত করুন -এছাড়া আপনি অতিরিক্ত বৈশিষ্ট্যকে মঞ্জুর করুন চয়ন করতে পারেন

http://www.jsonschema2pojo.org/

4) ইন্টারফেস fro এপি কলিং করুন

    public interface Webservices {

@POST("ApiUrlpath")
    Call<ResponseBean> ApiName(@Body JsonObject jsonBody);

}

আপনার যদি কোনও ফর্ম-ডেটা প্যারামিটার থাকে তবে নীচে লাইন যুক্ত করুন

@Headers("Content-Type: application/x-www-form-urlencoded")

ফর্ম-ডেটা প্যারামিটারের অন্য উপায় এই লিঙ্কটি পরীক্ষা করুন

5) প্যারামিটার হিসাবে শরীরে প্রবেশের জন্য জসনঅবজেক্ট তৈরি করুন

 private JsonObject ApiJsonMap() {

    JsonObject gsonObject = new JsonObject();
    try {
        JSONObject jsonObj_ = new JSONObject();
        jsonObj_.put("key", "value");
        jsonObj_.put("key", "value");
        jsonObj_.put("key", "value");


        JsonParser jsonParser = new JsonParser();
        gsonObject = (JsonObject) jsonParser.parse(jsonObj_.toString());

        //print parameter
        Log.e("MY gson.JSON:  ", "AS PARAMETER  " + gsonObject);

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return gsonObject;
}

)) এপিকে এভাবে কল করুন

private void ApiCallMethod() {
    try {
        if (CommonUtils.isConnectingToInternet(MyActivity.this)) {
            final ProgressDialog dialog;
            dialog = new ProgressDialog(MyActivity.this);
            dialog.setMessage("Loading...");
            dialog.setCanceledOnTouchOutside(false);
            dialog.show();

            Call<ResponseBean> registerCall = ApiHandler.getApiService().ApiName(ApiJsonMap());
            registerCall.enqueue(new retrofit2.Callback<ResponseBean>() {
                @Override
                public void onResponse(Call<ResponseBean> registerCall, retrofit2.Response<ResponseBean> response) {

                    try {
                        //print respone
                        Log.e(" Full json gson => ", new Gson().toJson(response));
                        JSONObject jsonObj = new JSONObject(new Gson().toJson(response).toString());
                        Log.e(" responce => ", jsonObj.getJSONObject("body").toString());

                        if (response.isSuccessful()) {

                            dialog.dismiss();
                            int success = response.body().getSuccess();
                            if (success == 1) {



                            } else if (success == 0) {



                            }  
                        } else {
                            dialog.dismiss();


                        }


                    } catch (Exception e) {
                        e.printStackTrace();
                        try {
                            Log.e("Tag", "error=" + e.toString());

                            dialog.dismiss();
                        } catch (Resources.NotFoundException e1) {
                            e1.printStackTrace();
                        }

                    }
                }

                @Override
                public void onFailure(Call<ResponseBean> call, Throwable t) {
                    try {
                        Log.e("Tag", "error" + t.toString());

                        dialog.dismiss();
                    } catch (Resources.NotFoundException e) {
                        e.printStackTrace();
                    }
                }

            });

        } else {
            Log.e("Tag", "error= Alert no internet");


        }
    } catch (Resources.NotFoundException e) {
        e.printStackTrace();
    }
}

9

আমি দেখতে পেয়েছি যে আপনি যখন কোনও যৌগিক বস্তুটি @Bodyপ্যারাম হিসাবে ব্যবহার করেন , এটি retrofit এর সাথে ভাল কাজ করতে পারে না GSONConverter(অনুমানের অধীনে আপনি এটি ব্যবহার করছেন)। আপনাকে এটি ব্যবহার করতে হবে JsonObjectএবং JSONObjectএটির সাথে কাজ করার সময় নয় , এটি NameValueParamsসম্পর্কে ভারবস না করে যোগ করে - আপনি কেবলমাত্র এটি দেখতে পারবেন যদি আপনি লগিং ইন্টারসেপ্টর এবং অন্য শেননিগানগুলির অন্য নির্ভরতা যুক্ত করেন।

সুতরাং আমি যা মোকাবিলার জন্য সর্বোত্তম পন্থা পেয়েছি তা ব্যবহার করছে RequestBody। আপনি RequestBodyএকটি সাধারণ এপিআই কল দিয়ে আপনার অবজেক্টটি চালু করুন এবং এটি চালু করুন। আমার ক্ষেত্রে আমি একটি মানচিত্র রূপান্তর করছি:

   val map = HashMap<String, Any>()
        map["orderType"] = orderType
        map["optionType"] = optionType
        map["baseAmount"] = baseAmount.toString()
        map["openSpotRate"] = openSpotRate.toString()
        map["premiumAmount"] = premiumAmount.toString()
        map["premiumAmountAbc"] = premiumAmountAbc.toString()
        map["conversionSpotRate"] = (premiumAmountAbc / premiumAmount).toString()
        return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JSONObject(map).toString())

এবং এই কল:

 @POST("openUsvDeal")
fun openUsvDeal(
        @Body params: RequestBody,
        @Query("timestamp") timeStamp: Long,
        @Query("appid") appid: String = Constants.APP_ID,
): Call<JsonObject>

2
রাতারাতি গুগল করার পরে এটি আমাকে সাহায্য করেছিল।
W4R10CK

8

পুনঃনির্মাণে স্কেলারসনভার্টারফ্যাক্টরি যুক্ত করুন:

গ্রেডে:

implementation'com.squareup.retrofit2:converter-scalars:2.5.0'

আপনার retrofit:

retrofit = new Retrofit.Builder()
            .baseUrl(WEB_DOMAIN_MAIN)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

আপনার কল ইন্টারফেস @ বডি পরামিতি স্ট্রিংয়ে পরিবর্তন করুন, যুক্ত করতে ভুলবেন না @Headers("Content-Type: application/json"):

@Headers("Content-Type: application/json")
@POST("/api/getUsers")
Call<List<Users>> getUsers(@Body String rawJsonString);

এখন আপনি কাঁচা জসন পোস্ট করতে পারেন।


6

আপনি যদি প্রতিটি এপিআই কলের জন্য পোজো ক্লাস তৈরি করতে না চান তবে আপনি হ্যাশম্যাপ ব্যবহার করতে পারেন।

HashMap<String,String> hashMap=new HashMap<>();
        hashMap.put("email","this@gmail.com");
        hashMap.put("password","1234");

এবং তারপরে এটি প্রেরণ করুন

Call<JsonElement> register(@Body HashMap registerApiPayload);

4

অনেক চেষ্টা করার পরেও, পাওয়া গেল যে প্রাথমিক পার্থক্যটি আপনাকে প্যারামিটার হিসাবে JsonObjectপরিবর্তে প্রেরণ করতে হবে JSONObject


আমিও একই ভুলটি করছিলাম: পি
মেহতাব আহমেদ

4

json পাঠাতে নিম্নলিখিত ব্যবহার করুন

final JSONObject jsonBody = new JSONObject();
    try {

        jsonBody.put("key", "value");

    } catch (JSONException e){
        e.printStackTrace();
    }
    RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),(jsonBody).toString());

এবং এটি ইউআরএল পাস

@Body RequestBody key

4

শীর্ষ উত্তরের উপর ভিত্তি করে, প্রতিটি অনুরোধের জন্য পিওজিও না তৈরি করার আমার কাছে একটি সমাধান রয়েছে।

উদাহরণস্বরূপ, আমি এই JSON পোস্ট করতে চাই।

{
    "data" : {
        "mobile" : "qwer",
        "password" : "qwer"
    },
    "commom" : {}
}

তারপরে, আমি এর মতো একটি সাধারণ শ্রেণি তৈরি করি:

import java.util.Map;
import java.util.HashMap;

public class WRequest {

    Map<String, Object> data;
    Map<String, Object> common;

    public WRequest() {
        data = new HashMap<>();
        common = new HashMap<>();
    }
}

অবশেষে, যখন আমার একটি জেসন লাগবে

WRequest request = new WRequest();
request.data.put("type", type);
request.data.put("page", page);

অনুরোধটি টীকা হিসাবে চিহ্নিত হয়েছে @Bodyতারপরে retrofit এ যেতে পারে।


4

আপনি যদি অতিরিক্ত ক্লাস তৈরি JSONObjectকরতে বা ব্যবহার করতে না চান তবে আপনি একটি ব্যবহার করতে পারেন HashMap

Retrofit ইন্টারফেস:

@POST("/rest/registration/register")
fun signUp(@Body params: HashMap<String, String>): Call<ResponseBody>

কল করুন:

val map = hashMapOf(
    "username" to username,
    "password" to password,
    "firstName" to firstName,
    "surname" to lastName
)

retrofit.create(TheApi::class.java)
     .signUp(map)
     .enqueue(callback)

3

Retrofit এ কাঁচা জসন প্রেরণের জন্য প্রয়োজনীয় জিনিস।

1) নীচের শিরোনামটি যুক্ত করার এবং অন্য কোনও সদৃশ শিরোনাম সরিয়ে ফেলার বিষয়টি নিশ্চিত করুন। যেহেতু, রেট্রোফিটের অফিসিয়াল ডকুমেন্টেশনে তারা উল্লেখ করেছেন-

নোট করুন যে শিরোনামগুলি একে অপরকে ওভাররাইট করে না। একই নামের সমস্ত শিরোনাম অনুরোধে অন্তর্ভুক্ত করা হবে।

@Headers({"Content-Type: application/json"})

2) ক। আপনি যদি কোনও রূপান্তরকারী কারখানা ব্যবহার করে থাকেন তবে আপনি স্ট্রিং, জেএসনোবজেক্ট, জসনঅবজেক্ট এমনকি একটি পোওও হিসাবে আপনার জসনকে পাস করতে পারেন। এছাড়াও পরীক্ষা করা হয়েছে, থাকার ScalarConverterFactoryকাজটি কেবল প্রয়োজনীয় নয় GsonConverterFactory

@POST("/urlPath")
@FormUrlEncoded
Call<Response> myApi(@Header("Authorization") String auth, @Header("KEY") String key, 
                     @Body JsonObject/POJO/String requestBody);

2) খ। আপনি যদি কোনও রূপান্তরকারী কারখানা ব্যবহার না করে থাকেন তবে আপনাকে রেট্রোফিটের ডকুমেন্টেশন হিসাবে ওখটপ -২ এর অনুরোধবডি ব্যবহার করা উচিত-

Retrofit উদাহরণে নির্দিষ্ট রূপান্তরকারী ব্যবহার করে অবজেক্টটিও রূপান্তরিত হবে। যদি কোনও রূপান্তরকারী যুক্ত না হয় তবে কেবলমাত্র অনুরোধবডি ব্যবহার করা যেতে পারে।

RequestBody requestBody=RequestBody.create(MediaType.parse("application/json; charset=utf-8"),jsonString);

@POST("/urlPath")
@FormUrlEncoded
Call<Response> myApi(@Header("Authorization") String auth, @Header("KEY") String key, 
                 @Body RequestBody requestBody);

3) সাফল্য !!


2

এটিই আমার বর্তমান সংস্করণ retrofit ২.6.২ এর জন্য কাজ করে ,

প্রথমত, আমাদের গ্রেডল নির্ভরতাগুলির তালিকায় আমাদের একটি স্কেলার রূপান্তরকারী যুক্ত করা দরকার, যা জাভা.এলং স্ট্রিং অবজেক্টগুলিকে পাঠ্য / সরল অনুরোধ সংস্থায় রূপান্তর করার যত্ন নেবে,

implementation'com.squareup.retrofit2:converter-scalars:2.6.2'

তারপরে, আমাদের একটি retrofit বিল্ডারের কাছে একটি রূপান্তর কারখানাটি পাস করতে হবে। এটি পরবর্তীতে রেট্রোফিটকে জানাবে যে কীভাবে @ বডি প্যারামিটারটিকে পরিষেবাতে রূপান্তর করা যায়।

private val retrofitBuilder: Retrofit.Builder by lazy {
    Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
}

দ্রষ্টব্য: আমার রেট্রোফিট নির্মাতায় আমার দু'টি রূপান্তরকারী রয়েছে Gsonএবং Scalarsআপনি উভয়ই ব্যবহার করতে পারেন তবে জসন বডি প্রেরণের জন্য আমাদের ফোকাস করা দরকার Scalarsযাতে আপনার Gsonএটি অপসারণের প্রয়োজন না হয় তবে

তারপরে স্ট্রিং বডি প্যারামিটারের সাহায্যে retrofit পরিষেবা।

@Headers("Content-Type: application/json")
@POST("users")
fun saveUser(@Body   user: String): Response<MyResponse>

তারপরে JSON বডি তৈরি করুন

val user = JsonObject()
 user.addProperty("id", 001)
 user.addProperty("name", "Name")

আপনার পরিষেবা কল করুন

RetrofitService.myApi.saveUser(user.toString())

2

✅✅✅✅✅✅✅✅✅✅✅✅ কার্যকরী সমাধান ✅✅✅✅✅✅✅✅✅✅✅✅

তৈরি করার সময় OkHttpClient এটি রেট্রোফিটের জন্য ব্যবহৃত হবে।

এটির মতো একটি ইন্টারসেপ্টর যুক্ত করুন।

 private val httpClient = OkHttpClient.Builder()
        .addInterceptor (other interceptors)
        ........................................

        //This Interceptor is the main logging Interceptor
        .addInterceptor { chain ->
            val request = chain.request()
            val jsonObj = JSONObject(Gson().toJson(request))

            val requestBody = (jsonObj
            ?.getJSONObject("tags")
            ?.getJSONObject("class retrofit2.Invocation")
            ?.getJSONArray("arguments")?.get(0) ?: "").toString()
            val url = jsonObj?.getJSONObject("url")?.getString("url") ?: ""

            Timber.d("gsonrequest request url: $url")
            Timber.d("gsonrequest body :$requestBody")

            chain.proceed(request)
        }

        ..............
        // Add other configurations
        .build()

এখন আপনার প্রতিটি retrofit কল এর URL এবং অনুরোধ বডি লগ ইন করা হবে Logcatএটি দ্বারা ফিল্টার"gsonrequest"


1

আমি এটি চেষ্টা করেছি: আপনি যখন আপনার রেট্রোফিট উদাহরণটি তৈরি করছেন, তখন এই রূপান্তর কারখানাটি পুনঃনির্মাণ নির্মাতার সাথে যুক্ত করুন:

gsonBuilder = new GsonBuilder().serializeNulls()     
your_retrofit_instance = Retrofit.Builder().addConverterFactory( GsonConverterFactory.create( gsonBuilder.create() ) )

1

টমিএসএম উত্তরের উপর ভিত্তি করে আমার সমস্যা সমাধান করুন (পূর্ববর্তী দেখুন)। তবে আমার লগইন করার দরকার ছিল না, আমি https গ্রাফকিউল এপিআই এর মতো পরীক্ষার জন্য retrofit2 ব্যবহার করেছি:

  1. জেসন টীকা (আমদানি জ্যাকসন.অনোটেশন.জসনপ্রোপার্টি) এর সহায়তায় আমার বেসরেসপন্স শ্রেণীর সংজ্ঞা দেওয়া হয়েছে।

    public class MyRequest {
        @JsonProperty("query")
        private String query;
    
        @JsonProperty("operationName")
        private String operationName;
    
        @JsonProperty("variables")
        private String variables;
    
        public void setQuery(String query) {
            this.query = query;
        }
    
        public void setOperationName(String operationName) {
            this.operationName = operationName;
        }
    
        public void setVariables(String variables) {
            this.variables = variables;
        }
    }
  2. ইন্টারফেসে কল পদ্ধতিটি সংজ্ঞায়িত:

    @POST("/api/apiname")
    Call<BaseResponse> apicall(@Body RequestBody params);
  3. টেস্টের শরীরে অ্যাপিক্যাল নামে পরিচিত: MyRequest টাইপের একটি ভেরিয়েবল তৈরি করুন (উদাহরণস্বরূপ "myLittleRequest")।

    Map<String, Object> jsonParams = convertObjectToMap(myLittleRequest);
    RequestBody body = 
         RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),
                        (new JSONObject(jsonParams)).toString());
    response = hereIsYourInterfaceName().apicall(body).execute();

0

এখানে প্রদত্ত উত্তরের বিষয়ে আরও স্পষ্টতার জন্য, আপনি কীভাবে এই এক্সটেনশন ফাংশনটি ব্যবহার করতে পারেন। এটি কেবলমাত্র যদি আপনি কোটলিন ব্যবহার করছেন

আপনি ব্যবহার করে থাকেন com.squareup.okhttp3:okhttp:4.0.1অবজেক্ট তৈরি পুরোনো পদ্ধতি MediaType এবং RequestBody অবচিত হয়েছে এবং এর মধ্যে ব্যবহার করা যাবে না Kotlin

আপনি এক্সটেনশানটি ফাংশন ব্যবহার করার জন্য একটি পেতে চান MediaType বস্তু এবং একটি ResponseBody , আপনার স্ট্রিং থেকে অবজেক্ট প্রথমত বর্গ যার মাধ্যমে আপনি তাদের ব্যবহার করার জন্য আশা নিম্নলিখিত পংক্তিগুলি যোগ করুন।

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody

আপনি এখন সরাসরি একটি অবজেক্ট পেতে পারেন MediaType এই ভাবে

val mediaType = "application/json; charset=utf-8".toMediaType()

রিকোয়েস্টবডিয়ের কোনও অবজেক্ট পেতে প্রথমে আপনি JSONObject কে রূপান্তর করতে চান এভাবে স্ট্রিংয়ে পাঠাতে। আপনাকে এটিতে মিডিয়াটাইপ অবজেক্টটি পাস করতে হবে।

val requestBody = myJSONObject.toString().toRequestBody(mediaType)

0

আমি কোডের নীচে লিখিত ডেটা প্রেরণ এবং গ্রহণের জন্য ভলির গতি এবং পুনঃনির্মাণের তুলনা করতে চেয়েছিলাম (পুনঃনির্মাণ অংশের জন্য)

প্রথম নির্ভরতা:

dependencies {
     implementation 'com.squareup.retrofit2:retrofit:2.4.0'
     implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}

তারপরে ইন্টারফেস:

 public interface IHttpRequest {

    String BaseUrl="https://example.com/api/";

    @POST("NewContract")
    Call<JsonElement> register(@Body HashMap registerApiPayload);
}

এবং সার্ভারে ডেটা পোস্ট করার জন্য প্যারামিটার সেট করতে একটি ফাংশন (মেইনএক্টিভিটিতে):

private void Retrofit(){

    Retrofit retrofitRequest = new Retrofit.Builder()
            .baseUrl(IHttpRequest.BaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    // set data to send
    HashMap<String,String> SendData =new HashMap<>();
    SendData.put("token","XYXIUNJHJHJHGJHGJHGRTYTRY");
    SendData.put("contract_type","0");
    SendData.put("StopLess","37000");
    SendData.put("StopProfit","48000");

    final IHttpRequest request=retrofitRequest.create(IHttpRequest.class);

    request.register(SendData).enqueue(new Callback<JsonElement>() {
        @Override
        public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
            if (response.isSuccessful()){
                Toast.makeText(getApplicationContext(),response.body().toString(),Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onFailure(Call<JsonElement> call, Throwable t) {

        }
    });

}

এবং আমি আমার ক্ষেত্রে ভলির চেয়ে দ্রুত রেট্রোফিটকে পেয়েছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.