@tanuki_ni_naritai

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

YahooAPIをVercel上で呼び出したい

解決したいこと

デプロイしたNuxtのWebアプリケーションから、YahooAPIの商品情報を取得したい

発生している問題・エラー

Yahooの商品検索のAPIからデータを取得したいのですが、ローカルだとうまくいきますが
デプロイしたものだとうまくいきません。

API→https://developer.yahoo.co.jp/webapi/shopping/v3/itemsearch.html

該当するソースコード・試したこと

案① Nuxtのプロキシ経由で呼び出す

結果:ローカルはOK,本番はNG(CORSエラー)
index.ts

      try {
        // 通信先のHTTP以降を指定する
        const response = await $axios.get("/ShoppingWebService/V3/itemSearch", {
          //パラメータリクエスト
          params: {
            appid: config.public.YAHOO_API_APPID,
            query: this.searchKeyword,
            image_size: 300,
            genre_category_id: sortGenre,
            price_from: this.minPrice,
            price_to: this.maxPrice,
            results: resultsNum,
            start: this.start,
            sort: sortOptions,
          },
        });
        const payload = response.data;

axios.ts

import axios from "axios";

export default defineNuxtPlugin((nuxtApp) => {
  const config = useRuntimeConfig();

  const instance = axios.create({
    baseURL: "/api/", // 無条件で "/api/" にする
  });

  nuxtApp.provide("axios", instance);
});

nuxt config

    server: {
      proxy: {
        "/api/": {
          target: "https://shopping.yahooapis.jp",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ""),
        },
      },
    },
  },

案② server>apiにサーバーレス関数をつくる

結果:ローカル・本番ともにNG

index.ts


      try {
        const response = await $axios.get("/api/yahoo", {
          params: {
            query: this.searchKeyword,
            results: 20,
            start: 1,
            appid: config.public.YAHOO_API_APPID, // 環境変数から取得
          },
        });
        const payload = response.data;

yahoo.ts (server>api配下にあります)

import type { VercelRequest, VercelResponse } from "@vercel/node";
import axios from "axios";

export default async function handler(req: VercelRequest, res: VercelResponse) {
  console.log("Request received:", req.method, req.url); // Log the request method and URL
  const {
    query,
    genre_category_id,
    price_from,
    price_to,
    results,
    start,
    sort,
  } = req.query;

  const YAHOO_API_URL =
    "https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch";
  const YAHOO_API_APPID = process.env.YAHOO_API_APPID;

  if (!YAHOO_API_APPID) {
    return res
      .status(500)
      .json({ error: "Yahoo API App ID is not set in environment variables." });
  }

  try {
    const params = {
      appid: YAHOO_API_APPID,
      query,
      genre_category_id,
      price_from,
      price_to,
      results,
      start,
      sort,
      image_size: 300,
    };

    const response = await axios.get(YAHOO_API_URL, { params });
    res.status(200).json(response.data);
  } catch (error: any) {
    res.status(error.response?.status || 500).json({ error: error.message });
  }
}

envには正しいアプリケーションID(Yahooで発行したもの)が入っていることを確認しています。
変数名も正しいです。
リクエストURLはともに同じにもかからず、下記エラーで返ってきます。

リクエスト URL:
https://nuxt-sales-app-git-main-mknkgwr1005s-projects.vercel.app/api/ShoppingWebService/V3/itemSearch?appid=my-app-id&query=%E7%99%BD%E5%B7%9E&image_size=300&results=20&start=1
リクエスト メソッド:
GET
ステータス コード:
404 Not Found
リモート アドレス:
64.29.17.129:443
参照ポリシー:
strict-origin-when-cross-origin
{
    "message": "Request failed with status code 404",
    "name": "AxiosError",
    "stack": "AxiosError: Request failed with status code 404\n    at uE (https://nuxt-sales-app-git-main-mknkgwr1005s-projects.vercel.app/_nuxt/A13jnFRI.js:32:1033)\n    at XMLHttpRequest.f (https://nuxt-sales-app-git-main-mknkgwr1005s-projects.vercel.app/_nuxt/A13jnFRI.js:32:5880)\n    at Zr.request (https://nuxt-sales-app-git-main-mknkgwr1005s-projects.vercel.app/_nuxt/A13jnFRI.js:34:1961)\n    at async Proxy.findCategoryDetail (https://nuxt-sales-app-git-main-mknkgwr1005s-projects.vercel.app/_nuxt/A13jnFRI.js:3216:2548)",
    "config": {
        "transitional": {
            "silentJSONParsing": true,
            "forcedJSONParsing": true,
            "clarifyTimeoutError": false
        },
        "adapter": [
            "xhr",
            "http",
            "fetch"
        ],
        "transformRequest": [
            null
        ],
        "transformResponse": [
            null
        ],
        "timeout": 0,
        "xsrfCookieName": "XSRF-TOKEN",
        "xsrfHeaderName": "X-XSRF-TOKEN",
        "maxContentLength": -1,
        "maxBodyLength": -1,
        "env": {},
        "headers": {
            "Accept": "application/json, text/plain, */*"
        },
        "baseURL": "/api/",
        "params": {
            "appid": "my-app-id",
            "category_id": 13457,
            "output": "json"
        },
        "method": "get",
        "url": "/ShoppingWebService/V1/categorySearch"
    },
    "code": "ERR_BAD_REQUEST",
    "status": 404
}

わかる方いらっしゃいましたご教示いただけますと幸いです。

0 likes

2Answer

「axios nuxt 使い方」でgoogle検索してみると、AIからの説明に以下の書き方があります。相対パスなら this.$axios.$get() は正しいかもしれません。

// コンポーネント内で利用する場合

export default {
  async mounted() {
    try {
      const response = await this.$axios.$get('/users'); // GETリクエストの例
      this.users = response.data;
    } catch (error) {
      console.error('Error fetching users:', error);
    }
  },
  data() {
    return {
      users: [],
    };
  },
};
0Like

URLが間違ってて、指定したAPIが存在しないから404エラーが出てると思います。Yahooの公式APIを使うなら正しいURLに直すか、自作APIならそのパスに対応するファイルがVercelにあるか確認すればよいかと。

確認方法の詳細知りたい場合、返信頂けますと幸いです。

0Like

Your answer might help someone💌