2016-12-12 4 views
0

私はレトロフィット2. URLにPOSTを送信すると、URLパラメータでポストを送るいくつかのパラメータがあります。はレトロフィット2

@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);   

urlがこの

www.websiteのように見えます。 com/server/directory/location.type?arg1 = value1 & arg2 = value2

POSTリクエストを使用するように要求されました。値(value1とvalue2)は実行時に動的です。私はXamarinでHttpClientを使ってプロジェクトを開始しましたが、今はJavaのネイティブで書き直しています。 C#で私がしなければならなかったのは、文字列を連結して結果の文字列を単一のPostに送ることでした。

Iは@Pathを使用しようとし、エラーがあった:

"サーバ/ディレクトリ/ location.type" が "{ARG1を}" が含まれていません。 (パラメータ#1)

そして、Iは@queryを使用しようとし、エラーがあった:

java.lang.IllegalArgumentExceptionが:フォームエンコード方法は、少なくとも一つの@Fieldを含まなければなりません。

最後に、私は私を助けるか、私は他の選択肢を持っていないする必要がある場合を教えてください。要求は任意の応答(私は5秒に接続タイムアウトをセッテ)

を取得することはありません@FieldてみましたGET要求を使用します。ここで

((EDIT)) クライアントのセットアップのための私のコードです:

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"; 
} 

私はテストを= 0にするとそれは決してそこには到達しない。私はandroid.os.NetworkOnMainThreadExceptionを避けるために、doInbackgroundでメソッド "callFunctionDB"を呼び出しました。

+0

は、Webサービスを呼び出すコードを共有します –

+1

'@ FormUrlEncoded'なぜですか? – njzk2

+0

あなたは正しいことが問題の1つでした –

答えて

3

Retrofitでは、フォームエンコーディングをリクエストする場合は、少なくとも1つのフォームパラメータが必要です。 POSTフィールドの代わりにクエリパラメータを使用しているため、アノテーションは必要ありません。 @FormUrlEncodedアノテーションを削除し、パラメータを@Queryアノテーションに変更します。

関連する問題