如何向Retrofit接口调用传递多个参数?Android对接Node.js接口问题
Hey there! Sounds like you've got a working Node.js endpoint that lets users add each other as friends via email, and you're just needing to map that correctly in your Android Retrofit setup. The key here is that your endpoint uses path parameters (the emails are part of the URL path), not query params or a request body—so let's adjust your Retrofit interface to handle both values.
Step 1: Update Your Retrofit Interface to Accept Two Path Parameters
Retrofit uses the @Path annotation to bind method arguments to placeholders in your URL path. You just need to add a second @Path parameter that matches the second email placeholder in your endpoint.
Kotlin Example:
interface UserApiService { // Base URL should be set to "https://fitnessrace.herokuapp.com/" @POST("users/{userEmail}/make_friend/{friendEmail}") suspend fun makeFriend( @Path("userEmail") currentUserEmail: String, @Path("friendEmail") friendEmail: String ): Response<Unit> // Replace Unit with your actual response model if needed }
Java Example:
public interface UserApiService { // Base URL should be set to "https://fitnessrace.herokuapp.com/" @POST("users/{userEmail}/make_friend/{friendEmail}") Call<Void> makeFriend( @Path("userEmail") String currentUserEmail, @Path("friendEmail") String friendEmail ); }
Step 2: How It Works
- The strings inside
@Path("xxx")must exactly match the placeholder names in your URL ({userEmail}and{friendEmail}). Retrofit will automatically replace these placeholders with the values you pass when calling the method. - For example, if you call
makeFriend("jane@example.com", "john@example.com"), Retrofit will build the full URL:https://fitnessrace.herokuapp.com/users/jane@example.com/make_friend/john@example.com
Which is exactly what you were testing in Postman!
Quick Notes to Avoid Issues
- URL Encoding: Retrofit automatically handles encoding special characters in emails (like
@or.), so you don't need to manually encode the email strings. If you ever need to skip automatic encoding (not recommended here), you can addencoded = trueto the@Pathannotation, e.g.,@Path(value = "userEmail", encoded = true). - Base URL Setup: Make sure your Retrofit instance is initialized with the base URL
https://fitnessrace.herokuapp.com/—the path in your interface should be the relative part after the base URL.
Example of Calling the Method
Kotlin (Using Coroutines):
// Inside a ViewModel or Repository val retrofit = Retrofit.Builder() .baseUrl("https://fitnessrace.herokuapp.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val userApi = retrofit.create(UserApiService::class.java) try { val response = userApi.makeFriend("current_user@example.com", "new_friend@example.com") if (response.isSuccessful) { // Handle success: show a toast, update UI, etc. } else { // Handle error: check response code, show error message } } catch (e: IOException) { // Handle network errors: no internet, timeout, etc. }
Java (Using Callback):
// Initialize Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://fitnessrace.herokuapp.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); UserApiService userApi = retrofit.create(UserApiService.class); Call<Void> call = userApi.makeFriend("current_user@example.com", "new_friend@example.com"); call.enqueue(new Callback<Void>() { @Override public void onResponse(Call<Void> call, Response<Void> response) { if (response.isSuccessful()) { // Success logic here } else { // Handle error response } } @Override public void onFailure(Call<Void> call, Throwable t) { // Handle network failure } });
That's it! This setup will replicate the exact request you were sending via Postman, letting your Android app call the makeFriend endpoint correctly with both email parameters.
内容的提问来源于stack exchange,提问作者Syed Saad

