【发布时间】:2016-12-13 06:29:37
【问题描述】:
我想用 Retrofit 2 发送一个 POST。url 有一些参数:
@Headers({
"Accept: application/x-www-form-urlencoded;",
"User-Agent: my-app"
})
@FormUrlEncoded
@POST("server/directory/location.type")
`public Call<POJOStringValue> dataWithUr(@Path("arg1") String arg1, @Path("arg2"), String arg2);
网址是这样的
www.website.com/server/directory/location.type?arg1=value1&arg2=value2
我被要求使用 POST 请求。值(value1 和 value2)在运行时是动态的。我使用 HttpClient 使用 Xamarin 开始了这个项目,现在我正在用 Java 本机重写它。在 C# 中,我所要做的就是连接字符串并将结果字符串发送到单个 Post 中。
我尝试使用@Path,但错误是:
“server/directory/location.type”不包含“{arg1}”。 (参数#1)
然后,我尝试使用@Query,错误是:
java.lang.IllegalArgumentException:表单编码方法必须至少包含一个@Field。
最后我尝试使用@Field,请求永远不会得到任何响应(我将连接超时设置为 5 秒)
请帮助我,或者告诉我是否除了使用 GET 请求之外别无选择。
((编辑)) 这是我设置客户端的代码:
private static void setupClient(){
final OkHttpClient client = new okhttp3.OkHttpClient.Builder()
.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build();
//define retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(iXUtils.getUrl_())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
this.client_ = retrofit.create(RequestInterface.class);
}
get() 方法:
public static RequestInterface get(){
return this.client_;
}
我是这样称呼它的:
public String callFunctionDB(String arg1, String arg2){
setupClient();
Call<POJOStringValue> call = get().dataWithUrlString(arg1, arg2);
try {
POJOStringValue response = call.execute().body();
String value = response.getValue();
int test = 0;
} catch (IOException e) {
String value = "it failded";
e.printStackTrace();
}
return "test";
}
我把 test=0 设置为能够设置一个断点,它永远不会到达那里。另外,我在 doInbackground 中调用了方法“callFunctionDB”以避免 android.os.NetworkOnMainThreadException。
【问题讨论】:
-
分享你的调用网络服务的代码
-
@FormUrlEncoded为什么? -
你是对的,这是问题之一