java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java 调用第三方接口

Java实现调用第三方相关接口

作者:程序yang

最近在做一个项目,需要调用第三方接口,本文主要介绍了Java实现调用第三方相关接口,具有一定的参考价值,感兴趣的可以了解一下

1.0.简单版

以下是一个使用 Java 实际请求“第三方”的简单示例代码。这个示例使用了 Java 的 OkHttp 库来发送 HTTP 请求和接收。

import okhttp3.*;
import java.io.IOException;
public class ChatGPT {
    private static final String API_ENDPOINT = "<your-api>";
    private static final String API_KEY = "<your-openai-api-key>";
    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();
        String prompt = "I like to eat pizza because";
        RequestBody requestBody = new FormBody.Builder()
                .add("prompt", prompt)
                .add("max_tokens", "50")
                .add("temperature", "0.5")
                .build();
        Request request = new Request.Builder()
                .url(API_ENDPOINT)
                .header("Authorization", "Bearer " + API_KEY)
                .header("Content-Type", "application/json")
                .post(requestBody)
                .build();
        Call call = client.newCall(request);
        Response response = call.execute();
        String responseBody = response.body().string();
        System.out.println(responseBody);
    }
}

在这个示例中,我们使用了OkHttp库来发送HTTP请求到OpenAI的GPT-3 API,并接收响应。我们需要将OpenAI提供的API密钥设置为API_KEY变量的值,并将要请求的文本设置为prompt变量的值。我们还需要指定一些请求参数,如max_tokens和temperature,用于控制生成的文本长度和创造性程度。最后,我们将API响应的主体内容打印到控制台中。

请注意,这个示例是一个简单的示例,实际使用中可能需要进行更多的错误处理和数据解析。另外,OpenAI提供了多种API和模型,具体的实现可能因模型和API而异。

📌执行结果:

{
  "error": {
    "message": "Invalid Content-Type header (application/x-www-form-urlencoded), expected application/json. (HINT: If you're using curl, you can pass -H 'Content-Type: application/json')",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

📌分析问题:

这个错误提示是由于请求头中的Content-Type设置为了application/x-www-form-urlencoded,但是OpenAI API要求请求头的Content-Type设置为application/json。因此,您需要在请求中将Content-Type修改为application/json。您可以使用OkHttp库的MediaType类来指定JSON格式的请求正文。以下是一个示例代码:

2.0.升级版

import okhttp3.*;
import java.io.IOException;
public class ChatGPT {
    private static final String API_ENDPOINT = "<your-api>";
    private static final String API_KEY = "<your-openai-api-key>";
    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();
        String prompt = "I like to eat pizza because";
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        String requestBody = "{\"prompt\":\"" + prompt + "\",\"max_tokens\":50,\"temperature\":0.5}";
        Request request = new Request.Builder()
                .url(API_ENDPOINT)
                .header("Authorization", "Bearer " + API_KEY)
                .header("Content-Type", "application/json")
                .post(RequestBody.create(mediaType, requestBody))
                .build();
        Call call = client.newCall(request);
        Response response = call.execute();
        String responseBody = response.body().string();
        System.out.println(responseBody);
    }
}

在这个示例中,我们使用了OkHttp库的MediaType类来指定请求正文的格式为JSON。我们将请求正文格式化为JSON字符串,并将其作为请求体发送。另外,我们还将Content-Type设置为application/json。

上面代码执行没有问题,但是遇到个别问题,会出现响应超时的异常错误:

📌执行结果:

Call call = client.newCall(request);
Response response = call.execute();
报错 timed out

📌分析问题:

当服务器响应请求的时间过长时,通常会发生“超时”错误。要修复此错误,您可以尝试以下操作:

2-1.call.timeout()怎么传入新的超时值

要为您的 OkHttpCall对象设置一个新的超时值,您可以使用该timeout方法并指定一个新的超时持续时间。

例如,如果你想设置 10 秒的超时,你可以使用下面的代码:

Call call = client.newCall(request);
call.timeout().timeout(10, TimeUnit.SECONDS);
Response response = call.execute();

在此代码中,该timeout方法返回的一个实例Timeout,您可以使用该实例通过该timeout方法设置新的超时值。timeout 的第一个参数是超时持续时间,第二个参数是时间单位(在本例中为TimeUnit.SECONDS)。

2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义

OkHttp 中的方法timeout有两个参数:

所以在代码中timeout(10, TimeUnit.SECONDS),10是超时的持续时间(以秒为单位),并且TimeUnit.SECONDS是指定持续时间的时间单位。这意味着 OkHttp 将在请求超时之前等待 10 秒。如果服务器在 10 秒内没有响应,OkHttp 将抛出超时异常。

3.0.进阶版

按照上面的改进思路,增加了call.timeout()方法。

Call call = client.newCall(request);
call.timeout().timeout(180, TimeUnit.SECONDS);
Response response = call.execute();

Call call = client.newCall(request);的后面增加了call.timeout().timeout(180, TimeUnit.SECONDS);这么一行代码,重新执行。

📌执行结果:

java.net.SocketTimeoutException: timeout

发现问题还是没有解决!

📌分析问题:

通常SocketTimeoutException表示客户端没有收到来自服务器的及时响应。当服务器响应时间过长或客户端与服务器之间存在网络连接问题时,可能会发生这种情况。

在您的情况下,该timeout方法用于设置 200 秒的超时值,这对于大多数用例来说应该足够了。但是,如果服务器在该时间段内仍未响应,您可能需要尝试增加超时值以查看是否可以解决问题。

另一个可能的原因SocketTimeoutException是客户端和服务器之间可能存在一些网络连接问题。您可能需要检查您的网络连接并确保它稳定可靠。

最后,也有可能是服务器本身的问题。您可能需要检查服务器日志以查看是否存在任何可能导致超时的错误或问题。

3-1.java.net.SocketTimeoutException: 超时如何解决

SocketTimeoutException通常在网络操作完成时间过长时抛出。要解决此错误,您可以尝试以下操作:

OkHttpClient client = new OkHttpClient.Builder()
  .connectTimeout(60, TimeUnit.SECONDS)
  .readTimeout(60, TimeUnit.SECONDS)
  .build();

这会将连接和读取超时设置为 60 秒。

4.0.终极版

对方法进行一下封装,方便接口调试

完整代码:

package com.example.business.controller;
import okhttp3.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Controller
@RequestMapping(value = "/chat")
public class ChatGPTController {
    private static final String API_ENDPOINT = "<your-api>";
    private static final String API_KEY = "<your-openai-api-key>";
    @ResponseBody
    @RequestMapping(value = "/get-chat-info", produces = "application/json;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.POST})
    public String getChatInfo(String prompt) throws IOException {
//        OkHttpClient client = new OkHttpClient();
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(180, TimeUnit.SECONDS)
                .readTimeout(180, TimeUnit.SECONDS)
                .build();
//        String prompt = "I like to eat pizza because";
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        String requestBody = "{\"prompt\":\"" + prompt + "\",\"max_tokens\":1024,\"temperature\":0.9,\"top_p\":1,\"frequency_penalty\":0.0,\"presence_penalty\":0.6}";
        Request request = new Request.Builder()
                .url(API_ENDPOINT)
                .header("Authorization", "Bearer " + API_KEY)
                .header("Content-Type", "application/json")
                .post(RequestBody.create(mediaType, requestBody))
                .build();
        Call call = client.newCall(request);
        call.timeout().timeout(180, TimeUnit.SECONDS);
        Response response = call.execute();
        String responseBody = response.body().string();
        System.out.println(responseBody);
        return responseBody;
    }
}

📌执行结果:

{
    "id": "cmpl-6k7pjisebdHLjNIF0wKoLyEhyOCVJ",
    "object": "text_completion",
    "created": 1676451219,
    "model": "text-davinci-003",
    "choices": [
        {
            "text": "\n有什么可以帮助您?",
            "index": 0,
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 4,
        "completion_tokens": 21,
        "total_tokens": 25
    }
}

PS:更多接口请查阅官方文档

到此这篇关于Java实现调用第三方相关接口的文章就介绍到这了,更多相关Java 调用第三方接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文