用retrofit请求网络,遇到这样一个错,Missing either @GET URL or @Url parameter.。
/com.uyac.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.uyac.test, PID: 10349
java.lang.IllegalArgumentException: Missing either @GET URL or @Url parameter.
for method GetWeatherData.getWeather
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:751)
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:742)
at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:207)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:169)
at retrofit2.Retrofit$1.invoke(Retrofit.java:146)
at java.lang.reflect.Proxy.invoke(Proxy.java:813)
at $Proxy0.getWeather(Unknown Source)
at com.uyac.test.activity.MainActivity.testRetrofitOkhttpGetWeatherData2(MainActivity.java:326)
at com.uyac.test.activity.MainActivity.onClick(MainActivity.java:160)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:179)
at android.app.ActivityThread.main(ActivityThread.java:6152)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
同样的错还有 Missing either @POST URL or @Url parameter.。
其实原因错误很简单,就是retrofit所对应的接口写错了。
@GET("")里面一定要有数据,不能为@GET 或者@GET("")
那有人就要问了,这个数据是什么呢?我只有baseUrl 和请求所需要的参数。
其实这个数据是_apiname,很多时候可以接在baseUrl后面,但是很多接口里面也当参数,这就导致没有这个数据了。
解决方法: 没有数据就加 . 或者 /
这样再次请求就不会报错了。
需要注意的是,@GET请求需要用@QueryMap
public interface GetWeatherData2 {
@GET("/") //没有数据就填 . 或者 /
public Call<WeatherModel> getWeather(@QueryMap Map<String ,String> map); //@GET请求参数对用 @QueryMap ,POST请求参数对应 @FieldMap
}
@POST请求需要用@FieldMap ,还有@FormUrlEcoded
public interface GetWeatherData {
@FormUrlEncoded //post请求必须加上
@POST("/") //没有数据就填 . 或者 /
public Call<WeatherModel> getWeather(@FieldMap Map<String,String> map); //POST请求参数对应 @FieldMap ,@GET请求参数对用 @QueryMap
}
下面用post写一个完整请求
接口代码
/**
* Created by Administrator on 2017/3/29.
*
* 用来获取天气数据
*/
public interface IGetWeatherData {
@FormUrlEncoded //post请求必须加上
@POST(".") //没有数据就填 . 或者 /
public Call<WeatherModel> getWeather(@FieldMap Map<String ,String> map); //POST请求参数对应 @FieldMap ,@GET请求参数对用 @QueryMap
}
Activity代码
package com.sqw.testretrofit;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity implements OnClickListener{
private Context context;
private Button button;
private TextView show_data_tv;
private final String BASE_URL = "http://api.k780.com:88/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
viewInit();
}
private void viewInit() {
button = (Button) findViewById(R.id.button);
show_data_tv = (TextView) findViewById(R.id.show_data_tv);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
getWeatherData();
break;
}
}
/**
* 获取数据
*/
private void getWeatherData() {
Map<String, String> map = new HashMap<>();
map.put("app", "weather.future");
map.put("weaid", "1");
map.put("appkey", "10003");
map.put("sign", "59bc3ef6191eb9f747dd4e83c99f2a4");
map.put("format", "json");
OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = retrofitBuilder.client(okhttpClientBuilder.build()).build();
IGetWeatherData iGetWeatherData = retrofit.create(IGetWeatherData.class);
Call<WeatherModel> callWeatherModel = iGetWeatherData.getWeather(map);
callWeatherModel.enqueue(new Callback<WeatherModel>() {
@Override
public void onResponse(Call<WeatherModel> call, Response<WeatherModel> response) {
ToastUtils.show(context,"请求成功");
show_data_tv.setText(" success : "+response.body().getSuccess()+"\n"
+" msgid : "+response.body().getMsgid()+"\n"
+" msg : "+response.body().getMsg());
}
@Override
public void onFailure(Call<WeatherModel> call, Throwable t) {
ToastUtils.show(context,"请求失败");
}
});
}
}
效果图
github地址:https://github.com/zhuzhushang/TestRetrofit