【问题标题】:Send a Post with url parameter with Retrofit 2使用 Retrofit 2 发送带有 url 参数的帖子
【发布时间】: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 为什么?
  • 你是对的,这是问题之一

标签: java android retrofit2


【解决方案1】:

如果您请求表单编码,Retrofit 要求您至少有一个表单参数。您已经回答了自己的问题——您使用的是查询参数而不是 POST 字段,因此不需要注释。去掉@FormUrlEncoded注解,把你的参数改成@Query注解。

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 2019-12-04
    • 1970-01-01
    • 2017-02-01
    • 2013-06-03
    • 2015-01-28
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多