像使用jQuery ajax

时间:2017-06-23 13:16:34

标签: java android jquery ajax retrofit2

我正在使用我网站上的jQuery ajax对我们的服务器发出POST请求,因此它可以向我发送我可以使用的json数据。 我正在制作的所有ajax请求都是这样的:

getLanguages(callback) {
    $.ajax({
        type: 'POST',
        crossDomain: true,
        dataType: 'JSON',
        cache: false,
        url: 'https://www.someurl.com/fc.php',
        data: {
            mode: 'language'
        },
        success: callback
    });
},

requestCountries(phone, callback) {
    $.ajax({
        type: 'POST',
        crossDomain: true,
        dataType: 'JSON',
        cache: false,
        url: 'https://www.someurl.com/fc.php',
        data: {
            mode: 'country',
            phone: phone,
            langId: myStorage.getLanguage()
        },
        success: callback
    });
},

data参数中唯一不同的东西,所以这很重要。 现在我正在尝试使用Retrofit在Android中实现相同的功能,但我无法理解任何内容,因为它基本上没有任何文档,所以这里是我设法根据用户示例构建的内容在这里和那里:

    String url = "https://www.someurl.com";
    JsonObject obj = new JsonObject();
    obj.addProperty("mode", "language");
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    MyRetrofit myretro = retrofit.create(MyRetrofit.class);
    myretro.getLanguage(obj, new Callback<Language>() {

        @Override
        public void onResponse(Call<Language> call, Response<Language> response) {
            Log.d("response", "response");
        }

        @Override
        public void onFailure(Call<Language> call, Throwable t) {
            Log.d("response", "response");
        }
    });

这是MyRetrofit.java

public interface MyRetrofit {

    @POST("/fc.php")
    Call<Void> getLanguage(@Body JsonObject json, Callback<Language> callback);
}

这是语言课

public class Language {
    private String langId;
    private String langName;
    private String langIcon;
}

当我运行代码时,它会因此错误而崩溃

java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #2)

我如何实现我的需要,任何帮助,解释或建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

你可以尝试

 // you do not need callback parameter here
 public interface MyRetrofit {

@POST("fc.php")
Call<Language> getLanguage(@Body JsonObject json);
  } 

还要确保您的baseurl

https://www.someurl.com/

终点是fc.php

  @POST("fc.php") 

例如,假设您有终点作为帖子/用户,您将拥有@POST(&#34; post / user&#34;),您的baseurl将是https://www.someurl.com/。另外,你的baseurl是一些实用程序文件作为常量,并定义你的终点,这样你就可以在一个地方轻松更改它们并在任何需要的地方引用它。

然后

Call<Language> call = myretro.getLanguage(obj);
// for asynchronous call
call.enqueue(new Callback<Language>() {

    @Override
    public void onResponse(Call<Language> call, Response<Language> response) {
        Log.d("response", "response");
    }

    @Override
    public void onFailure(Call<Language> call, Throwable t) {
        t.printstackTrace();

    }
});

提示:您可以使用pojo并使用gson将它们转换为json,这是gsonconverter所能获得的。

编辑:对于调试,您可以记录请求和响应

   OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {

            Request originalRequest = chain.request(); //Current Request

            Response response = chain.proceed(originalRequest); //Get response of the request

            //I am logging the response body in debug mode. When I do this I consume the response (OKHttp only lets you do this once) so i have re-build a new one using the cached body
            String bodyString = response.body().string();

            Log.i("NetworkModule", String.format("Sending request %s with headers %s ", originalRequest.url(), originalRequest.headers()));
            Log.i("", (String.format("Got response HTTP %s %s \n\n with body %s \n\n with headers %s ", response.code(), response.message(), bodyString, response.headers())));

            response = response.newBuilder().body(
                    ResponseBody.create(response.body().contentType(), bodyString))
                    .build();

            return response;
        }
    }).connectTimeout(1, TimeUnit.MINUTES)
            .readTimeout(1, TimeUnit.MINUTES).writeTimeout(2, TimeUnit.MINUTES).build();

然后

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

答案 1 :(得分:0)

尝试

Call<Void> getUser(....)