欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口

 更新時(shí)間:2023年09月08日 16:21:40   作者:程序yang  
最近在做一個(gè)項(xiàng)目,需要調(diào)用第三方接口,本文主要介紹了Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口,具有一定的參考價(jià)值,感興趣的可以了解一下

1.0.簡單版

以下是一個(gè)使用 Java 實(shí)際請(qǐng)求“第三方”的簡單示例代碼。這個(gè)示例使用了 Java 的 OkHttp 庫來發(fā)送 HTTP 請(qǐng)求和接收。

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

在這個(gè)示例中,我們使用了OkHttp庫來發(fā)送HTTP請(qǐng)求到OpenAI的GPT-3 API,并接收響應(yīng)。我們需要將OpenAI提供的API密鑰設(shè)置為API_KEY變量的值,并將要請(qǐng)求的文本設(shè)置為prompt變量的值。我們還需要指定一些請(qǐng)求參數(shù),如max_tokens和temperature,用于控制生成的文本長度和創(chuàng)造性程度。最后,我們將API響應(yīng)的主體內(nèi)容打印到控制臺(tái)中。

請(qǐng)注意,這個(gè)示例是一個(gè)簡單的示例,實(shí)際使用中可能需要進(jìn)行更多的錯(cuò)誤處理和數(shù)據(jù)解析。另外,OpenAI提供了多種API和模型,具體的實(shí)現(xiàn)可能因模型和API而異。

??執(zhí)行結(jié)果:

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

??分析問題:

這個(gè)錯(cuò)誤提示是由于請(qǐng)求頭中的Content-Type設(shè)置為了application/x-www-form-urlencoded,但是OpenAI API要求請(qǐng)求頭的Content-Type設(shè)置為application/json。因此,您需要在請(qǐng)求中將Content-Type修改為application/json。您可以使用OkHttp庫的MediaType類來指定JSON格式的請(qǐng)求正文。以下是一個(gè)示例代碼:

2.0.升級(jí)版

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

在這個(gè)示例中,我們使用了OkHttp庫的MediaType類來指定請(qǐng)求正文的格式為JSON。我們將請(qǐng)求正文格式化為JSON字符串,并將其作為請(qǐng)求體發(fā)送。另外,我們還將Content-Type設(shè)置為application/json。

上面代碼執(zhí)行沒有問題,但是遇到個(gè)別問題,會(huì)出現(xiàn)響應(yīng)超時(shí)的異常錯(cuò)誤:

??執(zhí)行結(jié)果:

Call call = client.newCall(request);
Response response = call.execute();
報(bào)錯(cuò) timed out

??分析問題:

當(dāng)服務(wù)器響應(yīng)請(qǐng)求的時(shí)間過長時(shí),通常會(huì)發(fā)生“超時(shí)”錯(cuò)誤。要修復(fù)此錯(cuò)誤,您可以嘗試以下操作:

  • 1.增加超時(shí):您可以嘗試增加代碼中的超時(shí)值。這將使服務(wù)器有更多時(shí)間在發(fā)生超時(shí)錯(cuò)誤之前進(jìn)行響應(yīng)。您可以通過調(diào)用該call.timeout()方法并以秒為單位傳入新的超時(shí)值來完成此操作。

  • 2.檢查您的網(wǎng)絡(luò)連接:有時(shí)緩慢或不可靠的網(wǎng)絡(luò)連接會(huì)導(dǎo)致超時(shí)錯(cuò)誤。確保您的互聯(lián)網(wǎng)連接穩(wěn)定且快速,并檢查其他網(wǎng)站或應(yīng)用程序是否遇到類似問題。

  • 3.查看服務(wù)器狀態(tài):可能是你所在的服務(wù)器運(yùn)行卡頓。

2-1.call.timeout()怎么傳入新的超時(shí)值

要為您的 OkHttpCall對(duì)象設(shè)置一個(gè)新的超時(shí)值,您可以使用該timeout方法并指定一個(gè)新的超時(shí)持續(xù)時(shí)間。

例如,如果你想設(shè)置 10 秒的超時(shí),你可以使用下面的代碼:

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

在此代碼中,該timeout方法返回的一個(gè)實(shí)例Timeout,您可以使用該實(shí)例通過該timeout方法設(shè)置新的超時(shí)值。timeout 的第一個(gè)參數(shù)是超時(shí)持續(xù)時(shí)間,第二個(gè)參數(shù)是時(shí)間單位(在本例中為TimeUnit.SECONDS)。

2-2.timeout(10, TimeUnit.SECONDS)兩個(gè)參數(shù)的意思,具體含義

OkHttp 中的方法timeout有兩個(gè)參數(shù):

  • 1.duration:這是 OkHttp 在請(qǐng)求超時(shí)之前等待的時(shí)間。它是一個(gè) long 值,表示超時(shí)持續(xù)時(shí)間。

  • 2.unit:這是用于參數(shù)的時(shí)間單位duration。它是枚舉的一個(gè)實(shí)例TimeUnit,允許您以秒、毫秒、微秒或納秒為單位指定持續(xù)時(shí)間。

所以在代碼中timeout(10, TimeUnit.SECONDS),10是超時(shí)的持續(xù)時(shí)間(以秒為單位),并且TimeUnit.SECONDS是指定持續(xù)時(shí)間的時(shí)間單位。這意味著 OkHttp 將在請(qǐng)求超時(shí)之前等待 10 秒。如果服務(wù)器在 10 秒內(nèi)沒有響應(yīng),OkHttp 將拋出超時(shí)異常。

3.0.進(jìn)階版

按照上面的改進(jìn)思路,增加了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);這么一行代碼,重新執(zhí)行。

??執(zhí)行結(jié)果:

java.net.SocketTimeoutException: timeout

發(fā)現(xiàn)問題還是沒有解決!

??分析問題:

通常SocketTimeoutException表示客戶端沒有收到來自服務(wù)器的及時(shí)響應(yīng)。當(dāng)服務(wù)器響應(yīng)時(shí)間過長或客戶端與服務(wù)器之間存在網(wǎng)絡(luò)連接問題時(shí),可能會(huì)發(fā)生這種情況。

在您的情況下,該timeout方法用于設(shè)置 200 秒的超時(shí)值,這對(duì)于大多數(shù)用例來說應(yīng)該足夠了。但是,如果服務(wù)器在該時(shí)間段內(nèi)仍未響應(yīng),您可能需要嘗試增加超時(shí)值以查看是否可以解決問題。

另一個(gè)可能的原因SocketTimeoutException是客戶端和服務(wù)器之間可能存在一些網(wǎng)絡(luò)連接問題。您可能需要檢查您的網(wǎng)絡(luò)連接并確保它穩(wěn)定可靠。

最后,也有可能是服務(wù)器本身的問題。您可能需要檢查服務(wù)器日志以查看是否存在任何可能導(dǎo)致超時(shí)的錯(cuò)誤或問題。

3-1.java.net.SocketTimeoutException: 超時(shí)如何解決

SocketTimeoutException通常在網(wǎng)絡(luò)操作完成時(shí)間過長時(shí)拋出。要解決此錯(cuò)誤,您可以嘗試以下操作:

  • 1.增加超時(shí)值:您可以嘗試增加網(wǎng)絡(luò)操作的超時(shí)值。這可以使用或類timeout中的方法來完成。例如,您可以使用以下代碼將超時(shí)設(shè)置為 60 秒:OkHttpClientURLConnection
OkHttpClient client = new OkHttpClient.Builder()
  .connectTimeout(60, TimeUnit.SECONDS)
  .readTimeout(60, TimeUnit.SECONDS)
  .build();

這會(huì)將連接和讀取超時(shí)設(shè)置為 60 秒。

  • 2.檢查您的網(wǎng)絡(luò)連接:確保您的網(wǎng)絡(luò)連接穩(wěn)定且快速。您可以嘗試重置您的路由器,或檢查您的互聯(lián)網(wǎng)服務(wù)提供商是否存在任何問題。

  • 3.檢查服務(wù)器狀態(tài):您嘗試連接的服務(wù)器可能流量過大或暫時(shí)關(guān)閉。您可以查看服務(wù)器狀態(tài)或聯(lián)系服務(wù)器管理員確認(rèn)。

  • 4.優(yōu)化您的代碼:如果您的代碼發(fā)出許多網(wǎng)絡(luò)請(qǐng)求,您可以對(duì)其進(jìn)行優(yōu)化以減少請(qǐng)求數(shù)量或?qū)⒄?qǐng)求一起批量處理。

4.0.終極版

對(duì)方法進(jìn)行一下封裝,方便接口調(diào)試

完整代碼:

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

??執(zhí)行結(jié)果:

{
    "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:更多接口請(qǐng)查閱官方文檔

到此這篇關(guān)于Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口的文章就介紹到這了,更多相關(guān)Java 調(diào)用第三方接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基數(shù)排序簡介及Java語言實(shí)現(xiàn)

    基數(shù)排序簡介及Java語言實(shí)現(xiàn)

    這篇文章主要介紹了基數(shù)排序簡介及Java語言實(shí)現(xiàn),涉及基數(shù)排序的基本思想簡單介紹和桶排序的分析,以及基數(shù)排序的Java實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • 高級(jí)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用之使用bitmap進(jìn)行字符串去重的方法實(shí)例

    高級(jí)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用之使用bitmap進(jìn)行字符串去重的方法實(shí)例

    今天小編就為大家分享一篇關(guān)于高級(jí)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用之使用bitmap進(jìn)行字符串去重的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包

    IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包

    這篇文章主要介紹了IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 最新評(píng)論