gpt4 book ai didi

android - 如何使用 Retrofit 库将 X-API-Key 和 X-Session 添加到 header ?

转载 作者:行者123 更新时间:2023-12-02 13:12:46 26 4
gpt4 key购买 nike

我想使用 Retrofit库而不是 HttpURLConnection对于我的multipart request将图像发送到服务器。我的 HttpURLConnection请求由于某种原因无法正常工作。

但我在 Retrofit 中有问题我不知道如何添加Session tokenAPI key应我的要求。

这是我为每个请求使用的解决方案 HttpURLConnection (并且它适用于除多部分请求之外的所有内容):

val con = url.openConnection() as HttpURLConnection
con.apply {
requestMethod = method
useCaches = false
doOutput = true
doInput = true
addRequestProperty(HEADER_CONNECTION, "Keep-Alive")
addRequestProperty(HEADER_CACHE_CONTROL, "no-cache")
addRequestProperty(HEADER_CONTENT_TYPE, "multipart/form-data")
addRequestProperty("X-API-Key", apiType.apiKey)
addRequestProperty("X-Session", getServerSession())
}

这是我使用改造库的要求:
val f = File(app.cacheDir, filename)
f.createNewFile()

val fos = FileOutputStream(f)
fos.write(data)
fos.flush()
fos.close()

val reqFile = RequestBody.create(MediaType.parse("image/*"), f)
val body = MultipartBody.Part.createFormData("upload", f.name, reqFile)

val httpUrl = HttpUrl.Builder()
.scheme("https")
.host(mainUrl)
.addPathSegment(apiSegment)
.addQueryParameter("X-API-Key", apiType.apiKey)
.addQueryParameter("X-Session", getServerSession())

val service = Retrofit.Builder().baseUrl(httpUrl.build()).build().create(Service::class.java)
val req = service.postImage(body)
val response = req.execute()

我用过 addQueryParameter ,因为我读到这是如何将这两个参数添加到 header 的方式,但这只会影响我的 API 调用 URL,它会将 API key 和 session 添加到 URL,服务器根本无法识别。

更新:

我的邮政服务界面:
internal interface MultipartService {
@Multipart
@POST("{url}")
fun postImage(@Part image: MultipartBody.Part): Call<ResponseBody>
fun setEndpoint(@Path("url") endpoint: String): Call<ResponseBody>
}

更新:已修复
   internal interface MultipartServicePost {
@POST("{url}")
@Multipart
fun postImage(@Part image: MultipartBody.Part, @Path(value = "url", encoded = true) endpoint: String): Call<ResponseBody>
}

最佳答案

addQueryParameter()顾名思义,就是在查询中添加参数。

你想要的是一个Interceptor .这是一个例子:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();

Request request = original.newBuilder()
.header("X-API-Key", apiType.apiKey)
.header("X-Session", getServerSession())
.method(original.method(), original.body())
.build();

return chain.proceed(request);
}
}

关于动态 url,您可以在定义界面时定义动态路径段。例子 :
public interface PostService {  

@GET("/posts/{post_id}")
Task getPost(@Path("post_id") long id);
}

关于android - 如何使用 Retrofit 库将 X-API-Key 和 X-Session 添加到 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57106614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com